游标
使用简单的SELECT语句, 没有办法得到第一行、下一行、或前10行, 也不存在每次一行地处理所有行的简单方法
有时候, 需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。游标是一个存储在MySQL服务器上的数据库查询, 它不是一条SELECT语句, 而是被该语句检索出来的结果集。在存储了游标之后, 应用程序可以根据需要滚动或浏览其中的内容
游标主要用户交互式应用, 其中用户需要滚动屏幕上的数据, 并对数据进行浏览或作出更改
MySQL的游标只能用户存储过程(和函数)
使用游标
使用游标有几个明确的步骤
- 在能够使用游标之前, 必须声明它。这个过程实际上没有检索数据, 它只是定义要使用的SELECT语句
- 一旦声明后, 必须打开游标以供使用
- 对于填有数据的游标, 根据需要取出(检索)各行
- 在结束游标使用时, 必须关闭游标
创建游标
游标用DECLARE语句创建。DECLARE命名游标, 并定义相应的SELECT语句, 根据需要带WHERE和其他子句。
MariaDB [crashcourse]> DELIMITER $ MariaDB [crashcourse]> CREATE PROCEDURE productorders() -> BEGIN -> DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; -> END $
存储过程处理完后, 游标就消失, 因为它局限于存储过程。
打开和关闭游标
游标用OPEN CURSOR语句来打开
MariaDB [crashcourse]> OPEN ordernumbers;
在处理OPEN语句时执行查询, 存储检索出的数据以供浏览和滚动。
游标处理完后, 应当使用如下语句关闭游标
MariaDB [crashcourse]> CLOSE ordernumbers;
CLOSE释放游标使用的所有内部内存和资源, 因此在每个游标不再需要时应该关闭。
在一个游标关闭后, 如果没有重新打开, 则不能使用它了。但是, 使用声明过的游标不需要再次声明, 用OPEN打开它就可以了
MariaDB [crashcourse]> DELIMITER $ MariaDB [crashcourse]> CREATE PROCEDURE productorders() -> BEGIN -> -- Declare the cursor -> DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; -> -> -- Open the cursor -> OPEN ordernumbers; -> -> --Close the cursor -> CLOSE ordernumbers; -> END $
使用游标数据
在一个游标被打开后, 可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据(所需的列), 检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针, 使下一条FETCH语句检索下一行
MariaDB [crashcourse]> DELIMITER $ MariaDB [crashcourse]> CREATE PROCEDURE productorders() -> BEGIN -> -> --Declare local variables -> DECLARE o INT; -> -> -- Declare the cursor -> DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; -> -> -- Open the cursor -> OPEN ordernumbers; -> -> -- Get order number -> FETCH ordernumbers INTO o -> -> --Close the cursor -> CLOSE ordernumbers; -> -> END $
FETCH用来检索当前行的order_num列(将自动从第一行开始)到一个名为o的局部声明的变量中。对检索出来的数据不做任何出来