MYSQL數據庫的遊標(cursor)

(4)遊標(cursor

是系統爲用戶開設的一個數據緩衝區,存放SQL語句的執行結果。每個遊標區都有一個名字。用戶可以用SQL語句逐一從遊標中獲取記錄,並賦給主變量,交由主語言進一步處理。
  概述:

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

       遊標實現了對mysql的存儲過程中循環讀取數據表中的對象的過程。

遊標的特性:

  READ ONLY 只讀,只能取值而不能賦值;

  NOT SCROOLABLE 不可回滾,只能順序讀取;

  ASENSITIVE 敏感,不能在已經打開遊標的表上執行update事務;

遊標操作:

聲明遊標:   DECLARE cursor_name CURSOR FOR select_statement

這個語句聲明一個光標。也可以在子程序中定義多個光標,但是一個塊中的每一個光標必須有唯一的名字。

打開遊標:    OPEN cursor_name

遊標FETCHFETCH cursor_name INTO var_name [, var_name] ...

這個語句用指定的打開光標讀取下一行(如果有下一行的話),並且前進光標指針。

關閉遊標CLOSE  CLOSE cursor_name

這個語句關閉先前打開的光標。如果未被明確地關閉,光標在它被聲明的複合語句的末尾被關閉。

使用遊標的實例:

CREATE PROCEDURE curdemo(tblName VARCHAR(100))

BEGIN

DECLARE done INT DEFAULT 0;

DECLARE b,c INT;

DECLARE cur1 CURSOR FOR SELECT id FROM v_wondyfox; 聲明遊標

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done =1;

drop view if exists v_wondyfox ;

set @sql=concat("create view v_wondyfox as select * from ", tblName);

PREPARE stmt1  FROM @sql;

EXECUTE stmt1 ;

DEALLOCATE PREPARE stmt1;

OPEN cur1; 打開遊標

REPEAT

FETCH cur1 INTO b; 獲取遊標內容

select b;

UNTIL done END REPEAT;

CLOSE cur1; 關閉遊標

 

END

 

 

CREATE PROCEDURE curdemo()

BEGIN

     DECLARE done INT DEFAULT 0;

     DECLARE a CHAR(16);

     DECLARE b,c INT;

     DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;

     DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

     OPEN cur1;

     OPEN cur2;

     REPEAT

          FETCH cur1 INTO a, b;

          FETCH cur2 INTO c;

          IF NOT done THEN

              IF b < c THEN

                  INSERT INTO test.t3 VALUES (a,b);

              ELSE

                  INSERT INTO test.t3 VALUES (a,c);

              END IF;

         END IF;

     UNTIL done END REPEAT;

    CLOSE cur1;

    CLOSE cur2;

END

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章