1. 程式人生 > >MySql儲存過程—7、遊標(Cursor)

MySql儲存過程—7、遊標(Cursor)

1、遊標的作用及屬性

遊標的作用就是用於對查詢資料庫所返回的記錄進行遍歷,以便進行相應的操作;遊標有下面這些屬性:

    a、遊標是隻讀的,也就是不能更新它;

    b、遊標是不能滾動的,也就是隻能在一個方向上進行遍歷,不能在記錄之間隨意進退,不能跳過某些記錄;

    c、避免在已經開啟遊標的表上更新資料。

2、如何使用遊標

使用遊標需要遵循下面步驟:

     a、首先用DECLARE語句宣告一個遊標              

DECLARE cursor_name CURSOR FOR SELECT_statement;
上面這條語句就對,我們執行的select語句返回的記錄指定了一個遊標   

     b、其次需要使用OPEN語句來開啟上面你定義的遊標

OPEN cursor_name;
     c、接下來你可以用FETCH語句來獲得下一行資料,並且遊標也將移動到對應的記錄上(這個就類似java裡面的那個iterator)。
FETCH cursor_name INTO variable list;
     d、然後最後當我們所需要進行的操作都結束後我們要把遊標釋放掉。
CLOSE cursor_name;
在使用遊標時需要注意的是,使用定義一個針對NOT FOUND的條件處理函式(condition handler)來避免出現“no data to fetch”這樣的錯誤,條件處理函式就是當某種條件產生時所執行的程式碼,這裡但我們遊標指到記錄的末尾時,便達到NOT FOUND這樣條件,這個時候我們希望繼續進行後面的操作,所以我們會在下面的程式碼中看到一個CONTINUE。先看看我們的表格內容:

下面的遊標使用演示獲取庫存量小於100的產品的程式碼code,這個程式碼純粹演示如何使用,在這裡沒有其他任何意義:)

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`CursorProc` $$
CREATE PROCEDURE `test`.`CursorProc` ()
BEGIN
 DECLARE  no_more_products, quantity_in_stock INT DEFAULT 0;
 DECLARE  prd_code VARCHAR(255);
 DECLARE  cur_product CURSOR FOR   SELECT code FROM products;  /*First: Delcare a cursor,首先這裡對遊標進行定義*/
 DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_products = 1; /*when "not found" occur,just continue,這個是個條件處理,針對NOT FOUND的條件*/

 /* for  loggging information 建立個臨時表格來保持*/
 CREATE TEMPORARY TABLE infologs (
 Id int(11) NOT NULL AUTO_INCREMENT,
 Msg varchar(255) NOT NULL,
 PRIMARY KEY (Id)
 );

 OPEN  cur_product; /*Second: Open the cursor 接著使用OPEN開啟遊標*/
 FETCH  cur_product INTO prd_code; /*Third: now you can Fetch the row 把第一行資料寫入變數中,遊標也隨之指向了記錄的第一行*/

 REPEAT

 SELECT  quantity INTO quantity_in_stock
 FROM  products
 WHERE  code = prd_code;
 
 IF  quantity_in_stock < 100 THEN
 INSERT  INTO infologs(msg)
 VALUES  (prd_code);
 END  IF;
 FETCH  cur_product INTO prd_code;

 UNTIL  no_more_products = 1
 END REPEAT;
 CLOSE  cur_product;  /*Finally: cursor need be closed 用完後記得用CLOSE把資源釋放掉*/
 SELECT *  FROM infologs;
 DROP TABLE  infologs;
END $$

DELIMITER ;
下面是最終的結果: