前言
简单介绍一下游标。
正文
需要MySQL 5 MySQL 5添加了对游标的支持,因此,本章内容适用于MySQL 5及以后的版本。
有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。
游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。
在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。
只能用于存储过程 不像多数DBMS,MySQL游标只能用于存储过程(和函数)
使用说明
使用游标涉及几个明确的步骤。
-
在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句。
-
一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。
-
对于填有数据的游标,根据需要取出(检索)各行。
-
在结束游标使用时,必须关闭游标。
在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。
DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句。
例如,下面的语句定义了名为ordernumbers的游标,使用了可以检索所有订单的SELECT语句。
create PROCEDURE processorders()BEGINDECLARE ordernumbers CURSORFORSELECT order_num FROM orders;END;
这里只是定义了但是并没有使用。
然后我们将其删除:
DROP PROCEDURE processorders
从新创建一个完整的例子。
create PROCEDURE processorders()BEGINDECLARE done Boolean DEFAULT 0;DECLARE o INT;DECLARE t DECIMAL(8,2);-- DECLARE the CURSORDECLARE ordernumbers CURSORFORSELECT order_num FROM orders;-- DECLARE conitnue handleDECLARE CONTINUE HANDLER FOR SQLSTATE \'02000\' SET done =1;-- Create a table to store the resultsCREATE TABLE if not EXISTS ordertotals(order_num INT,total DECIMAL(8,2));-- open the CURSOROPEN ordernumbers;-- loop through all rowsREPEAT-- Get order numberFETCH ordernumbers into o;-- Get the total for this orderCALL ordertotal(o,1,t);-- INSERT orderr and total into ordertotalsINSERT INTO ordertotals(order_num, total)VALUES(o,t);-- end REPEATUNTIL done END REPEAT;-- close the CURSORCLOSE ordernumbers;END;
这是一个相对简单的例子。
首先定义了一个ordernumbers。
然后DECLARE CONTINUE HANDLER FOR SQLSTATE \’02000\’ SET done =1; 定义了一个触发条件,当 SQLSTATE \’02000\’的时候执行SET done =1。
通过fetch 把结果放到 o 中,然后调用存储过程ordertotal,将该订单的结果查出来,然后就存入到ordertotals表中。
CALL processorders
然后查询出来是:
结
下一节触发器。