首頁  >  文章  >  資料庫  >  mysql進階(三)遊標簡易教程

mysql進階(三)遊標簡易教程

黄舟
黄舟原創
2017-02-09 15:13:01901瀏覽

mysql遊標簡易教學

        從MySQL V5.5開始,並進行了一次重大的改變,就是將InnoDB作為預設的儲存引擎。 InnoDB支援事務,而且擁有相關的RDBMS特性:ACID事務支持,資料完整性(支援外鍵),災難復原能力等等。

現在簡單總結一下游標的知識。

(一)認識遊標(cursor)

遊標簡單來說就是查詢出來的資料索引,透過對遊標的操作(第一個位置、最後一個位置、上一個位置、下一個位置)可以遍歷出數據。

使用遊標(cursor)的一個主要的原因就是把集合運算轉換成單一記錄處理方式。用SQL語言從資料庫檢索資料後,結果會放在記憶體的一塊區域中,結果往往是一個含有多個記錄的集合。遊標機制允許使用者在SQL server內逐行地存取這些記錄,並按照使用者自己的意願來顯示和處理這些記錄。

在資料庫中,遊標是一個十分重要的概念。遊標提供了一種對從表中檢索出的資料進行操作的靈活手段,就本質而言,遊標實際上是一種能從包含多個資料記錄的結果集中每次提取一筆記錄的機制。遊標總是與一條SQL 選擇語句相關聯,因為遊標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多筆記錄)和結果集中指向特定記錄的遊標位置組成。當決定對結果集進行處理時,必須宣告一個指向該結果集的遊標。如果曾經用 C 語言寫過對文件進行處理的程序,那麼遊標就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對於遊標而言,其道理是相同的。可見光標能夠實現以與傳統程式讀取平面檔案類似的方式處理來自基礎表的結果集,從而把表中資料以平面檔案的形式呈現給程式。

我們知道關聯式資料庫管理系統實質是面向集合的,在MS SQL SERVER 中並沒有一種描述表中單一記錄的表達形式,除非使用where 子句來限制只有一筆記錄被選取。因此我們必須藉助於遊標來進行面向單一記錄的資料處理。由此可見,遊標允許應用程式對查詢語句select 傳回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作;它還提供對基於遊標位置而對錶中數據進行刪除或更新的能力;而且,正是遊標把作為面向集合的資料庫管理系統和麵向行的程式設計兩者連結起來,使兩個資料處理方式能夠進行溝通。 

在資料庫開發過程中,當你擷取的資料只是一筆記錄時,你所寫的事務語句程式碼往往會使用SELECT INSERT 語句。但是我們常常會遇到這樣情況,就是從某一結果集中逐一讀取一筆記錄。那麼如何解決這種問題呢?遊標為我們提供了一個極為優秀的解決方案-那就是使用遊標

就是一個可讀的標識,用來標識資料取到什麼地方了。

(二)遊標特性

1,只讀

2,不滾動

3,不敏感的

(三)使用遊標

需要強調的是,遊標必須在定義處理程序之前被定義,需要強調的是,遊標必須在定義處理程序之前被定義,需要強調但變數必須在定義遊標之前被定義,順序就是變數定義-遊標定義-處理程序。

1.定義遊標

DECLARE cursor_name CURSOR FOR select_statement

這個語句宣告一個遊標。也可以在子程式中定義多個遊標,一個區塊中的每一個遊標必須命名唯一。聲明遊標後也是單一操作的。

 

2. 遊標OPEN

OPEN cursor_name

這個語句打開先前聲明的遊標。

 

3. 遊標FETCH

FETCH cursor_name INTO var_name [, var_name] ...

這個語句用指定的開啟遊標讀取下一行(如果有下一行的話),並且前進遊標指標至該行。

 

4. 游标CLOSE

CLOSE cursor_name

这个语句关闭先前打开的游标,注意,用完后必须关闭。

(四)示例

下面是一个存储过程,里面用到游标,逐条更新数据(批量更新数据)

BEGIN
 DECLARE  no_more_record INT DEFAULT 0;
 DECLARE  pID BIGINT(20);
 DECLARE  pValue DECIMAL(15,5);
 DECLARE  cur_record CURSOR FOR   SELECT colA, colB from tableABC;  /*首先这里对游标进行定义*/
 DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_record = 1; /*这个是个条件处理,针对NOT FOUND的条件,当没有记录时赋值为1*/
 
 
 OPEN  cur_record; /*接着使用OPEN打开游标*/
 FETCH  cur_record INTO pID, pValue; /*把第一行数据写入变量中,游标也随之指向了记录的第一行*/
 
 
 WHILE no_more_record != 1 DO
 INSERT  INTO testTable(ID, Value)
 VALUES  (pID, pValue);
 FETCH  cur_record INTO pID, pValue;
 
 END WHILE;
 CLOSE  cur_record;  /*用完后记得用CLOSE把资源释放掉*/
END

以上就是 mysql进阶(三)游标简易教程的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn