搜索
 找回密码
 立即注册
发新帖

mariadb教程[70] 游标

时间:2020-3-21 13:22 0 610 | 复制链接 |

610

主题

610

帖子

0

积分

网站编辑

Rank: 8Rank: 8

积分
0
本帖最后由 O'Reilly 于 2020-3-21 16:49 编辑

游标是一个存储在mariadb服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
不像多数DBMS,mariadb游标只能用于存储过程(和函数)。
使用游标涉及几个明确的步骤:
1.在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的select语句。
2.一旦声明后,必须打开游标以供使用。这个过程用前面定义的select语句把数据实际检索出来。
3.对于填有数据的游标,根据需要取出(检索)各行。
4.在结束游标使用时,必须关闭游标。
在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。

创建游标
  1. create PROCEDURE processorders()
  2. begin
  3. declare ordernumbers cursor
  4. for
  5. select order_num from orders;
  6. end;
复制代码

打开和关闭游标
如果你不明确关闭游标,mariadb将会在到达end语句时自动关闭它。
  1. create PROCEDURE processorders()
  2. begin
  3. declare ordernumbers cursor
  4. for
  5. select order_num from orders;
  6. open ordernumbers;
  7. close ordernumbers;
  8. end;
复制代码

使用游标数据
在一个游标被打开后,可以使用fetch语句分别访问它的每一行。fetch指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条fetch语句检索下一行(不重复读取同一行)。
示例1,从游标中检索单个行(第一行)
  1. create PROCEDURE processorders()
  2. begin
  3. declare o int;
  4. declare ordernumbers cursor
  5. for
  6. select order_num from orders;
  7. open ordernumbers;
  8. fetch ordernumbers into o;
  9. close ordernumbers;
  10. end;
复制代码
示例2
循环检索数据,从第一行到最后一行
  1. create PROCEDURE processorders()
  2. begin
  3. declare done boolean DEFAULT 0;
  4. declare o int;

  5. declare ordernumbers cursor
  6. for
  7. select order_num from orders;

  8. declare continue handler for SQLSTATE '02000' set done=1
  9. open ordernumbers;
  10. repeat
  11. fetch ordernumbers into o;
  12. until done end repeat;
  13. close ordernumbers;
  14. end;
复制代码
除了repeat语句外,mariadb还支持循环语句,它可用来重复执行代码,知道使用leave语句手动退出位置。通常repeaat语句的语法使它更适合于对游标进行循环。
  1. create PROCEDURE processorders()
  2. begin
  3. declare done boolean DEFAULT 0;
  4. declare o int;
  5. declare t DECIMAL(8,2);

  6. declare ordernumbers cursor
  7. for
  8. select order_num from orders;

  9. declare continue handler for SQLSTATE '02000' set done=1

  10. create table if not exists ordertotals(order_num int,total DECIMAL(8,2));
  11. open ordernumbers;
  12. repeat
  13. fetch ordernumb(o,1,t);
  14. insert into ordertotals(order_num,total) values(o,t);
  15. until done end repeat;
  16. close ordernumbers;
  17. end;
复制代码




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 返回顶部