mysql 儲存過程和函式中游標的使用
阿新 • • 發佈:2018-11-19
在儲存過程和函式中,可以使用游標對結果集進行迴圈的處理。
游標的使用包括游標的生命、OPEN、fetch、和close,其語法如下:
1、宣告游標:
declare 游標名 cursor for select_statement(查詢語句)
2、open游標:
open 游標名
3、fetch 游標
fetch 游標名 into 變數名...;
4、close游標
close 游標名
以下例子是一個簡單的使用游標的過程,對payment 表按照行進行迴圈的處理,按照staff_id 值的不同累加 amount的值,
判斷迴圈結束的條件是捕獲not found 的條件,當fetch 游標找不到下一條記錄的時候,就會關閉游標然後推出過程。
CREATE DEFINER=`root`@`::1` PROCEDURE `payment_stat`() begin declare i_staff_id int; //定義變數 declare d_amount decimal(5,2);//定義變數 declare cur_payment cursor for select staff_id,amount from payment;//定義游標的宣告 declare exit handler for not found close cur_payment;//處理程式的宣告 set @x1=0; set @x2=0; open cur_payment; repeat fetch cur_payment into i_staff_id,d_amount; if i_staff_id =2 then set @x1 = @x1 + d_amount; else set @x2 = @x2 + d_amount; end if; until 0 end repeat; close cur_payment; end
payment中staff_id和amount 的部分值如下,方便理解游標的作用。
1 | 4.99 | 2 | 4.99 | 2 | 0.99 | 2 | 3.99 | 2 | 6.99 | 2 | 0.99 | 1 | 0.99 | 2 | 0.99 | 1 | 5.99 | 1 | 4.99 | 1 | 4.99 | 2 | 0.99 | 2 | 2.99 | 2 | 0.99 | 2 | 2.99 | 1 | 7.99 | 2 | 4.99 | 1 | 1.99 | 2 | 6.99 | 2 | 4.99 | 1 | 6.99 | 1 | 0.99 | 1 | 2.99 | 2 | 9.99 | 2 | 2.99 |
注意: 儲存過程中定義變數、條件、處理程式、游標都是通過declare 定義的,它們之間是有先後順序要求的。
變數和條件必須在最前面宣告, 然後才是游標的宣告,最後才可以是處理程式的宣告。