游标谓词

游标谓词是一些 SQL 关键字,可用于确定当前作用域内定义的游标的状态。它们提供了一种方法以轻松了解游标是否打开或是否存在与游标相关联的行。

可在 SQL 和 SQL PL 语句中游标状态可用作谓词条件的任何位置引用游标谓词。可使用的游标谓词包括:
IS OPEN
此谓词可用于确定游标是否处于打开状态。游标解析为函数和过程的参数的情况下,此谓词非常有用。尝试打开游标之前,可使用此谓词来确定游标是否已打开。
IS NOT OPEN
此谓词可用于确定游标是否已关闭。其值是 IS OPEN 的逻辑反义词。在尝试实际关闭游标之前确定游标是否关闭时,此谓词会非常有用。
IS FOUND
此谓词可用于确定执行 FETCH 语句后游标是否包含行。如果最后一个 FETCH 语句成功执行,那么 IS FOUND 谓词值为 true。如果最后一个 FETCH 语句执行后导致找不到行,那么结果为 false。在下列情况下,结果未知:
  • 游标变量名称的值为 null
  • 游标变量名称的底层游标未打开
  • 在执行第一个 FETCH 操作之前,针对底层游标对谓词进行了求值
  • 最后一个 FETCH 操作返回了错误
IS FOUND 谓词在循环并在每次迭代时执行访存的 SQL PL 逻辑的一部分中会很有用。该谓词可用于确定是否还有要访存的行。它可以有效替代条件处理程序的使用,该条件处理程序用于检查没有其他要访存的行时发生的错误情况。

使用 IS FOUND 的替代方法是使用 IS NOT FOUND(这是 IS FOUND 的相反值)。

示例

以下脚本定义 SQL 过程,该过程引用这些谓词以及成功编译和调用过程所需的必备对象:
CREATE TABLE T1 (c1 INT, c2 INT, c3 INT)@

insert into t1 values (1,1,1),(2,2,2),(3,3,3) @

CREATE TYPE myRowType AS ROW(c1 INT, c2 INT, c3 INT)@

CREATE TYPE myCursorType AS myRowType CURSOR@


CREATE PROCEDURE p(OUT count INT)
LANGUAGE SQL
BEGIN
  DECLARE C1 cursor;
  DECLARE lvarInt INT;

  SET count = -1;
  SET c1 = CURSOR FOR SELECT c1 FROM t1;

  IF (c1 IS NOT OPEN) THEN
     OPEN c1;
  ELSE 
     set count = -2;
  END IF;

  set count = 0;
  IF (c1 IS OPEN) THEN 
  
    FETCH c1 into lvarInt;

    WHILE (c1 IS FOUND) DO
      SET count = count + 1;
      FETCH c1 INTO lvarInt;
    END WHILE;
  ELSE
     SET count = 0;
  END IF;

END@

CALL p()@