1. 程式人生 > >mysql 儲存過程和函式中游標的使用

mysql 儲存過程和函式中游標的使用

在儲存過程和函式中,可以使用游標對結果集進行迴圈的處理。

游標的使用包括游標的生命、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 定義的,它們之間是有先後順序要求的。

       變數和條件必須在最前面宣告, 然後才是游標的宣告,最後才可以是處理程式的宣告。