人大金仓数据库KingbaseES PLSQ隐式游标属性

83 阅读4分钟

金仓数据库KingbaseES PLSQL隐式游标属性介绍

关键字:

KingbaseES、游标、隐式游标、人大金仓、KingbaseES

游标的概念

游标是一种用于访问查询结果集的机制,它可以被看作是指向SQL查询结果集的指针。在PL/SQL中,游标的使用可分为两种:隐式游标和显示游标。显示游标是由用户创建并管理,需要对它进行显示的声明、打开、使用和关闭。而隐式游标是由系统创建并管理的会话游标,它不需要显示地声明、打开或关闭,系统会自动处理隐式游标的生命周期。本文将重点介绍隐式游标属性

隐式游标属性概述

当我们执行一个SELECT或DML语句时,PL/SQL都会为该语句自动创建一个隐式游标,但我们无法控制隐式游标。为了方便地处理隐式游标的操作,PL/SQL提供了一组属性,允许开发人员可以从中获取游标的状态和操作结果集。

隐式游标属性值得语法为SQL%attribute,因此,又将隐式游标称为SQL游标。SQL%attribute总是指向最近执行的SELECT或DML语句。如果此时没有执行这样的语句,那么从SQL%attribute中获取的值为NULL。隐式游标会在其关联的语句执行完毕后自动关闭。然而,其实在另一个SELECT或DML语句执行之前,仍然可以访问其属性值。需要注意的是,游标属性只能在过程语句中使用,而不能再SQL语句中使用。

隐式游标属性列表

KingbaseES中提供的隐式游标属性主要有以下几种:

  1. SQL%ISOPEN:用于检查游标是否处于打开状态。对于隐式游标,始终为false,因为隐式游标在执行完毕后会自动关闭
  2. SQL%FOUND:用于检查最近一次查询是否返回了至少一行数据。

如果最近的 SELECT 或 DML 语句有数据返回,则为TURE;

如果最近的 SELECT 或 DML 语句没有数据返回,则为FALSE;

如果没有运行 SELECT 或 DML 语句,则为 NULL。

  1. SQL%NOTFOUND:用于检查最近一次查询是否没有返回任何数据

如果最近的 SELECT 或 DML 语句没有数据返回,则为TRUE;

如果最近的 SELECT 或 DML 语句有数据返回,则为FALSE

如果没有运行 SELECT 或 DML 语句,则为 NULL。

  1. SQL%ROWCOUNT:用于获取最近的SELECT 或 DML 语句返回的行数。如果没有运行 SELECT 或 DML 语句,则为 NULL。
  2. SQL%BULK_ROWCOUNT(i):复合属性,用于处理“forall”语句执行的批量操作。类似于关联数组,其中i 表示最近完成的 FORALL 语句中受第 i 个 DML 语句影响的行数。
  3. SQL%BULK_EXCEPTIONS:复合属性,将获取FORALL语句所抛出的所有异常信息。

• SQL%BULK_EXCEPTIONS(i).ERROR_INDEX:表示第i个抛出异常的 DML 语句对应的编号。

• SQL%BULK_EXCEPTIONS(i).ERROR_CODE:表示第i个抛出异常的 DML 语句在KingbaseES数据库中对应错误代码。

使用示例

下面是一些使用隐式游标属性的示例

DROP TABLE IF EXISTS student;

CREATE TABLE student (id number, score number);

INSERT INTO student VALUES(1,88);

INSERT INTO student VALUES(2,96);

\set SQLTERM /

CREATE OR REPLACE PROCEDURE proc (stu_id number) AS

BEGIN

-- 执行一条DML语句

DELETE FROM student WHERE id = stu_id;

--通过隐式游标属性获取游标的状态和操作结果集

IF SQL%FOUND THEN

RAISE NOTICE 'Successful deletion of student: %', v_id;

ELSE

RAISE NOTICE 'No eligible students';

END IF;

RAISE NOTICE 'Rows processed: %', SQL%ROWCOUNT;

IF SQL%ISOPEN THEN

RAISE NOTICE 'Cursor is open';

ELSE

RAISE NOTICE 'Cursor is close';

END IF;

END;

/

BEGIN

proc(1);

END;

/打印结果如下:

image.png

注意事项

• 隐式游标属性仅适用于隐式游标,不适用于显示游标。

• 最近执行的SELECT或DML语句可能在不同的作用域内,如果希望保留属性值以备将来使用,我们应该立即将其给配给局部变量。否则其他操作(如子程序调用)可能会更改属性的值。

参考资料

《KingbaseES_PLSQL过程语言参考手册》