MySQL游标(cursor)定义及使用

MySQL中的游标主要用于存储过程中,具有不敏感、只读和不可滚动的特性。游标声明需在处理程序声明前,变量和条件声明后,且与SELECT语句相关联。FETCH语句用于获取游标下一行数据,而OPEN和CLOSE用于开启和关闭游标。在示例中展示了如何在存储过程中声明和使用游标进行数据操作。
摘要由CSDN通过智能技术生成

提到MySQL游标,多半在存储过程中定义及使用。

以下说明摘自MySQL官网:

MySQL 支持存储程序中的游标。语法与嵌入式 SQL 中的一样。游标具有以下属性:

  • 不敏感:服务器可能会也可能不会复制其结果表
  • 只读:不可更新
  • 不可滚动:只能单向遍历,不能跳行

游标声明必须出现在处理程序声明之前以及变量和条件声明之后。

游标申明语法:

DECLARE cursor_name CURSOR FOR select_statement

cursor_name:定义的游标名称

select_statement:SQL查询语句

此语句声明一个游标并将其与 SELECT检索要由游标遍历的行的语句相关联。要稍后获取行,请使用FETCH语句。语句检索的列数 SELECT必须与语句中指定的输出变量数相匹配 FETCH

SELECT语句不能有INTO子句。

游标声明必须出现在处理程序声明之前以及变量和条件声明之后。

存储的程序可能包含多个游标声明,但在给定块中声明的每个游标必须具有唯一的名称。

对于通过 SHOW语句可用的信息,在许多情况下可以通过将游标与INFORMATION_SCHEMA表一起使用来获得等效信息。

Cursor FETCH语法:

FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...

此语句获取与指定游标(必须打开)关联的语句的下一行 SELECT,并推进游标指针。如果存在一行,则提取的列存储在命名变量中。语句检索的列数 SELECT必须与语句中指定的输出变量数相匹配 FETCH

如果没有更多行可用,则出现 No Data 条件,SQLSTATE value '02000'。要检测此条件,您可以为其(或条件)设置一个处理程序 NOT FOUND

请注意,另一个操作(例如 a SELECT或 another FETCH)也可能通过引发相同条件来导致处理程序执行。如果有必要区分哪个操作引发了条件,请将该操作放在它自己的 BEGIN ... END块中,以便它可以与它自己的处理程序相关联。

游标的开启及关闭,必须成对出现,语法:

open cursor_name;

close cursor_name;

定义一个游标的完整语法示例:

CREATE PROCEDURE curdemo(IN in_id varchar(32))
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a CHAR(16);
  DECLARE b, c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1 where id=in_id;
  DECLARE cur2 CURSOR FOR SELECT id,data FROM test.t2 where id=in_id;
  # 申明游标遍历结束的标记
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  # 打开游标
  OPEN cur1;
  OPEN cur2;

  # 遍历游标
  read_loop: LOOP
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF done THEN
      LEAVE read_loop;# 如果遍历结束,退出循环
    END IF;
    IF b < c THEN
      INSERT INTO test.t3 VALUES (a,b);
    ELSE
      INSERT INTO test.t3 VALUES (a,c);
    END IF;
  END LOOP;

  # 关闭游标
  CLOSE cur1;
  CLOSE cur2;
END;

写在最后的踩坑点:

1.申明游标时,必须定义一个完整的SQL查询语句。

MySQL官网游标(cursor)说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流沙QS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值