21 使用游标

21.1 游标

在存储过程中使用游标可以对一个结果集进行移动遍历。

游标主要用于交互式应用,其中用户需要对数据集中的任意行进行浏览和修改。

21.2 使用游标

使用游标的四个步骤:

  1. 声明游标,这个过程没有实际检索出数据,它只是定义要使用的SELECT语句; 
  2. 打开游标;
  3. 取出数据;
  4. 关闭游标。

在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后, 可根据需要频繁地执行取操作。

21.2.1 创建游标

游标用DECLARE语句创建。

例如下面的例子定义了名为ordernumbers的游标,使用了可以检索所有订单的SELECT语句。

CREATE PROCEDURE processorders()
BEGIN
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;
END;

DECLARE语句用来定义和命名游标,这里为ordernumbers。 存储过程处理完成后,游标就消失。在定义游标之后,可以打开它。

21.2.2 打开和关闭游标

游标用OPEN CURSOR语句来打开:

OPEN ordernumbers;

在处理OPEN语句时执行查询,存储检索出的数据以供浏览和滚动。

游标处理完成后,应当使用如下语句关闭游标:

CLOSE ordernumbers;

CLOSE释放游标使用的所有内部内存和资源,因此在每个游标不再需要时都应该关闭。

在一个游标关闭后,如果没有重新打开,则不能使用它。但是,使用声明过的游标不需要再次声明,用OPEN语句打开它就可以了。

21.2.3 使用游标数据

在一个游标被打开后,可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据(所需的列),检索出来的数据存储在什么地方。它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行(不重复读取同一行)。 

第一个例子从游标中检索单个行(第一行):

CREATE PROCEDURE processorders()
BEGIN
    --Declare local variables
    DECLARE o INT;

    --Declare the cursor
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;

    --Open the cursor
    OPEN oedernumbers;

    --Get order number
    FETCH ordernumbers INTO o;

    --Close the cursor
    CLOSE ordernumbers;

END;

其中FETCH用来检索当前行的order_num列(将自动从第一行开始)到一个名为o的局部声明的变量中。对检索出的数据不做任何处理。

 第二个例子,循环检索数据,从第一行到最后一行:

CREATE PROCEDURE processorders()
BEGIN

    --Declare local variables
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE o INT;

    --Declare the cursor
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;
    
    -- 定义了一个 continue handler,当 sqlstate '02000' 这个条件出现时,会执行 set done = 1
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

    --Open the cursor
    OPEN ordernumbers;

    --Loop through all rows
    REPEAT

        --Get order number
        FETCH ordernumbers INTO o;

    --End of loop
    UNTIL done END REPEAT;

    --Close the cursor
    CLOSE ordernumbers;
END

这个例子使用FETCH检索当前order_num到声明的名为o的变量中。但与前一个例子不一样的是,这个例子中的FETCH是在REPEAT内,因此它反复执行直到done为真。为使它起作用,用一个DEFAULT 0

定义变量done。

那么, done怎样才能在结束时被设置为真呢?

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
原文地址:https://www.cnblogs.com/xlzfdddd/p/10171754.html