当 OceanBase 执行一个 SQL 语句时,它将结果集和处理信息保存在一块未命名的私有内存区域,并设置一个指针指向这块内存区域起始值。这个指针就是游标。使用游标,每次可以获取一行记录,游标属性会返回游标的状态信息。

    每次运行一个 DML 语句,或者一个 STORED PROCEDURE SELECT INTO 语句时,OceanBase 都会打开一个隐式游标。您可以从游标的属性值里获取游标的信息,但是不能操作这个游标。当 SQL 运行结束后,数据库会关闭这个游标。游标的属性值会一直不变,直到下一个 DML 或 SELECT INTO 语句被执行。

    STORED PROCEDURE 也允许声明游标,声明的游标会包含一个游标变量名跟一个查询语句(SQL SELECT 语句),查询会返回记录集。在声明游标后,您需要使用游标对记录集进行遍历(不管是显式的还是隐式的)。

    要隐式的使用游标,可以对游标使用 FOR LOOP 语句。语法格式如下:

    1. FOR record_name IN cursor_name LOOP
    2. statement
    3. [ statement ]...
    4. 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 。