当 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