关键字:
GET、人大金仓、KingbaseES
GET语句介绍
在PLSQL中,GET语句通常用来获得系统的状态指示语句。
- GET语句的语法
get_statement ::=
GET [ CURRENT ] DIAGNOSTICS variable { = | := } item [ , ... ];
- GET语句的语法解析
item 是系统的一些表示状态信息的关键字,目前 item 有两个取值:
• ROW_COUNT 最近执行的 SQL 语句处理的元组个数
• SYS_CONTEXT 执行 GET 语句时的调用堆栈
GET语句的使用场景
(1)ROW_COUNT:捕获最近的SQL命令处理的行数
\set SQLTERM /
CREATE OR REPLACE FUNCTION func1() RETURNS INT AS
DECLARE
a1 bigint;
BEGIN
DELETE FROM te1;
GET DIAGNOSTICS a1 = ROW_COUNT;
RAISE NOTICE 'ROW_COUNT is %',a1;
RETURN 1;
END;
/
SELECT func1();
(2)SYS_CONTEXT:捕获异常时的stack信息
\set SQLTERM /
CREATE OR REPLACE FUNCTION func1() RETURNS INT AS
DECLARE
a1 text;
BEGIN
INSERT INTO te1 VALUES(3,'tianjin');
GET DIAGNOSTICS a1 =SYS_CONTEXT;
RAISE NOTICE 'SYS_CONTEXT is %',a1;
RETURN 1;
END;
/
SELECT func1();
(3)另外,获得系统的状态指示还有一种方式是使用变量 FOUND。变量 FOUND 是一个布尔类型的局部变量,在每一个存储过程体中初始值是 false,下面语句的执行将修改 FOUND 的值:
- SELECT INTO 若没有元组返回,则 FOUND 是 false,否则 FOUND 是 true。
- PERFORM 若这个命令产生或者删除元组,则 FOUND 是 true,否则是 false。
- UPDATE INSERT DELETE 若没有影响任何元组,则 FOUND 是 false,否则是 true。
- FETCH 若得到一个元组,则 FOUND 是 true,否则是 false。
- FOR 若执行超过一次(含一次),则 FOUND 是 true,否则是 false。若存在 FOR 循环,则会设置 FOUND, 在 FOR 循环内部,FOUND 变量不会再次被 FOR 循环修改,但有可能被 FOR循环中执行的语句修改。
示例:
CREATE OR REPLACE FUNCTION func1() RETURNS INT AS $$
DECLARE
a1 int;
BEGIN
DELETE FROM te1;
IF FOUND THEN
INSERT INTO te2 VALUES(1,'test found');
END IF;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
SELECT func1();
SELECT * FROM te2;




