当 OceanBase 执行一个 SQL 语句时,它将结果集和处理信息保存在一块未命名的私有内存区域,并设置一个指针指向这块内存区域起始值。这个指针就是游标。使用游标,每次可以获取一行记录,游标属性会返回游标的状态信息。
每次运行一个 DML 语句,或者一个 STORED PROCEDURE SELECT INTO 语句时,OceanBase 都会打开一个隐式游标。您可以从游标的属性值里获取游标的信息,但是不能操作这个游标。当 SQL 运行结束后,数据库会关闭这个游标。游标的属性值会一直不变,直到下一个 DML 或 SELECT INTO 语句被执行。
STORED PROCEDURE 也允许声明游标,声明的游标会包含一个游标变量名跟一个查询语句(SQL SELECT 语句),查询会返回记录集。在声明游标后,您需要使用游标对记录集进行遍历(不管是显式的还是隐式的)。
要隐式的使用游标,可以对游标使用 FOR LOOP 语句。语法格式如下:
FOR record_name IN cursor_name LOOP
statement
[ statement ]...
END LOOP;
要显式的使用游标,先打开游标(使用 OPEN 语句);然后从结果集获取数据(使用 FETCH 语句),默认每次只处理一行记录,也可以使用 BULK FETCH 语句批量获取数据;结束后再关闭游标(使用 CLOSE 语句)。
获取游标属性值的语法是 cursor_name%attribute
,如:c1%NOTFOUND
。
下表列举了常用的游标属性及其返回值的描述。
属性名 | 声明的游标的值 | 隐式游标的值 |
---|---|---|
%FOUND | 如果游标是打开状态,但是没有 FETCH 操作,则返回 NULL。 如果最近一次 FETCH 操作返回了一行记录,则返回 TRUE 。 如果最近一次 FETCH 操作没有返回记录,则返回 FALSE 。 | 如果没有 DML 或 SELECT INTO 语句运行,则返回 NULL 。 如果最近运行的 DML 或 SELECT INTO 语句返回一行记录,则返回 TRUE 。 如果最近运行的 DML 或 SELECT INTO 语句没有返回记录, 则返回 FALSE 。 |
%NOTFOUND | 如果游标是打开状态,但是没有FETCH操作,则返回 NULL。 如果最近一次 FETCH 操作返回了一行记录,则返回 FALSE。 如果最近一次 FETCH 操作没有返回记录,则返回 TRUE。 | 如果没有 DML 或 SELECT INTO 语句运行,则返回 NULL 。 如果最近运行的 DML 或 SELECT INTO 语句返回一行记录,则返回 FALSE。 如果最近运行的 DML 或 SELECT INTO 语句没有返回记录, 则返回 TRUE。 |
%ROWCOUNT | 如果游标是打开状态,会返回一个大于或等于0的数字。 | 如果没有 DML 或 SELECT INTO 语句运行,则返回 NULL ;否则,返回一个大于或等于0的数字。 |
%ISOPEN | 如果游标是打开状态,返回 TRUE ;否则,返回 FALSE 。 | 总是 FALSE 。 |