游标谓词
游标谓词是一些 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 的替代方法是使用 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()@