mysql必知必会--学习笔记(18)-- 游标

1、创建游标

mysql中游标只能在存储过程和函数中使用。

CREATE PROCEDURE processorders()
BEGIN
    DECLARE ordernumbers CURSOR
    FOR 
    SELECT order_num FROM orders;
END;

2、打开和关闭游标

OPEN ordernumbers;
CLOSE ordernumbers;

3、使用游标数据

CREATE PROCEDURE processorders()
BEGIN
    DECLARE o INT; 
    DECLARE ordernumbers CURSOR
    FOR 
    SELECT order_num FROM orders;
    OPEN ordernumbers;
         FETCH ordernumbers INTO o;
         SELECT o;
    CLOSE ordernumbers; 
END;
其中 FETCH 用来检索当前行的 order_num 列(将自动从第一行开
始)到一个名为 o 的局部声明的变量中。对检索出的数据不做

任何处理。

4、循环检索数据

CREATE PROCEDURE processorder()
BEGIN 
  DECLARE done BOOLEAN DEFAULT 0;
  DECLARE o INT;
  DECLARE t DECIMAL(8,2);
  DECLARE ordernumbers CURSOR 
  FOR 
  SELECT order_num FROM orders;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  CREATE TABLE IF NOT EXISTS ordertotals(order_num INT,
  total DECIMAL(8,2));
  OPEN ordernumbers;
  REPEAT
    FETCH ordernumbers INTO o;
    IF NOT done THEN
    SELECT o;
    CALL ordertotal1(o, 1,t);
    INSERT INTO ordertotals(order_num, total) VALUES(o,t);
    END IF;
  UNTIL done END REPEAT;
  CLOSE ordernumbers;
END;
和教材中的不同,由于repeat 和do while 想用,会多执行一次操作,使用IF语句判断是否结束。

蓝色部分:

这条语句定义了一个 CONTINUE HANDLER ,它是在条件出现时被执行
的代码。这里,它指出当 SQLSTATE '02000' 出现时, SET done=1。SQLSTATE
'02000' 是一个未找到条件,当 REPEAT 由于没有更多的行供循环而不能继
续时,出现这个条件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章