金仓数据库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中提供的隐式游标属性主要有以下几种:
- SQL%ISOPEN:用于检查游标是否处于打开状态。对于隐式游标,始终为false,因为隐式游标在执行完毕后会自动关闭
- SQL%FOUND:用于检查最近一次查询是否返回了至少一行数据。
如果最近的 SELECT 或 DML 语句有数据返回,则为TURE;
如果最近的 SELECT 或 DML 语句没有数据返回,则为FALSE;
如果没有运行 SELECT 或 DML 语句,则为 NULL。
- SQL%NOTFOUND:用于检查最近一次查询是否没有返回任何数据
如果最近的 SELECT 或 DML 语句没有数据返回,则为TRUE;
如果最近的 SELECT 或 DML 语句有数据返回,则为FALSE
如果没有运行 SELECT 或 DML 语句,则为 NULL。
- SQL%ROWCOUNT:用于获取最近的SELECT 或 DML 语句返回的行数。如果没有运行 SELECT 或 DML 语句,则为 NULL。
- SQL%BULK_ROWCOUNT(i):复合属性,用于处理“forall”语句执行的批量操作。类似于关联数组,其中i 表示最近完成的 FORALL 语句中受第 i 个 DML 语句影响的行数。
- 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;
/打印结果如下:
注意事项
• 隐式游标属性仅适用于隐式游标,不适用于显示游标。
• 最近执行的SELECT或DML语句可能在不同的作用域内,如果希望保留属性值以备将来使用,我们应该立即将其给配给局部变量。否则其他操作(如子程序调用)可能会更改属性的值。