MySQL基础之使用游标

游标

使用简单的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的局部声明的变量中。对检索出来的数据不做任何出来

原文地址:https://www.cnblogs.com/featherwit/p/13435850.html