当前位置:嗨网首页>书籍在线阅读

09-光标的使用

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

+----------+----------+

在存储过程和函数中,可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPEN、FETCH和CLOSE,其语法分别如下。

声明光标:

DECLARE cursor_name CURSOR FOR select_statement

OPEN光标:

OPEN cursor_name

FETCH光标:

FETCH cursor_name INTO var_name [, var_name] . .

CLOSE光标:

CLOSE cursor_name

以下例子是一个简单的使用光标的过程,对 payment 表按照行进行循环的处理,按照staff_id值的不同累加amount的值,判断循环结束的条件是捕获NOT FOUND的条件,当FETCH光标找不到下一条记录的时候,就会关闭光标然后退出过程。

mysql> delimiter $$

mysql>

mysql> CREATE 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;

-> $$

Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql>

mysql> call payment_stat();

Query OK, 0 rows affected (0.11 sec)

mysql> select @x1,@x2;

+----------+----------+

| @x1 | @x2 |

| 33927.04 | 33489.47 |

+----------+----------+

1 row in set (0.00 sec)

注意:变量、条件、处理程序、光标都是通过DECLARE定义的,它们之间是有先后顺序要求的。变量和条件必须在最前面声明,然后才能是光标的声明,最后才可以是处理程序的声明。