MySql 使用儲存過程和遊標讀取並更新資料
阿新 • • 發佈:2019-01-23
1、遊標的作用及屬性
遊標的作用就是用於對查詢資料庫所返回的記錄進行遍歷,以便進行相應的操作;遊標有下面這些屬性:
a、遊標是隻讀的,也就是不能更新它;
b、遊標是不能滾動的,也就是隻能在一個方向上進行遍歷,不能在記錄之間隨意進退,不能跳過某些記錄;
c、避免在已經開啟遊標的表上更新資料。
2、如何使用遊標
使用遊標需要遵循下面步驟:
a、首先用DECLARE語句宣告一個遊標
- DECLARE cursor_name CURSORFOR SELECT_statement;
b、其次需要使用OPEN語句來開啟上面你定義的遊標
- OPEN cursor_name;
- FETCH cursor_name INTO variable list;
- CLOSE cursor_name;
下面的遊標使用演示獲取庫存量小於100的產品的程式碼code,這個程式碼純粹演示如何使用,在這裡沒有其他任何意義:)
- DELIMITER $$
- DROPPROCEDURE IF EXISTS `test`.`CursorProc` $$
- CREATEPROCEDURE `test`.`CursorProc` ()
- BEGIN
- DECLARE no_more_products, quantity_in_stock INTDEFAULT 0;
- DECLARE prd_code VARCHAR(255);
-
DECLARE cur_product CURSOR
- DECLARECONTINUE HANDLER FORNOT FOUND SET no_more_products = 1; /*when"not found" occur,just continue,這個是個條件處理,針對NOT FOUND的條件*/
- /* for loggging information 建立個臨時表格來保持*/
- CREATETEMPORARYTABLE infologs (
- Id int(11) NOTNULL AUTO_INCREMENT,
- Msg varchar(255) NOTNULL,
- PRIMARYKEY (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
- INSERTINTO 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;
- DROPTABLE infologs;
- END $$
- DELIMITER ;