MySql儲存過程—7、遊標(Cursor)
阿新 • • 發佈:2019-02-09
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 ;