VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

ERROR_STATE函数

功能描述

Vastbase G100在SQL Server兼容模式下支持ERROR_STATE函数,可以用于返回导致TRY…CATCH 构造的CATCH 块运行的错误状态号。

函数作用域

ERROR_STATE函数支持在 CATCH 块作用域内的任意位置被调用任意次。

函数返回类型

int

函数返回值

  • 在TRY…CATCH构造的CATCH块中调用时,返回导致CATCH运行的错误的状态号,在Vastbase G100中即错误号。

  • 在CATCH作用域之外被调用时,返回NULL

注意事项

  • 该特性仅在数据库兼容模式为SQL Server时能够使用(即创建DB时DBCOMPATIBILITY='MSSQL'),在其他数据库兼容模式下不能使用该特性。

  • 该函数依赖TRY…CATCH的逻辑完整,在PL/pgSQL语言函数中使用。

  • 调用ERROR_STATE函数时,()可以不加。可参考示例2

  • 当前ERROR_STATE函数在CATCH块中调用时只返回1,为默认情况。

语法格式

ERROR_STATE()

示例

前置步骤: 创建兼容模式为SQL Server的库db_sqlserver,并进入。

CREATE DATABASE db_sqlserver DBCOMPATIBILITY='MSSQL';
\c db_sqlserver

示例1: 在系统表PG_PROC中查询ERROR_STATE函数。

select proname from pg_proc where proname='error_state';

查询结果显示为:

   proname
-------------
 error_state
(1 row)

示例2: 分别在CATCH作用域内、外调用error_state函数。

1、创建存储过程pro_test,其中存在除数为0的错误。并分别在不同的位置调用error_state函数。

create or replace procedure pro_test()
as
begin
begin try
raise notice 'error_state1 is:%',error_state();
raise notice 'error_state1 is:%',error_state;
select 1/0;
end try
begin catch
raise notice 'error_state2 is:%',error_state();
raise notice 'error_state2 is:%',error_state;
end catch;
raise notice 'error_state3 is:%',error_state();
raise notice 'error_state3 is:%',error_state;
end ;
/

2、调用存储过程。

call pro_test();

只有在CATCH块中调用的error_state函数返回的是错误号,其余都返回NULL。返回结果分别为:

NOTICE:  error_state1 is:<NULL>
NOTICE:  error_state1 is:<NULL>
NOTICE:  error_state2 is:1
NOTICE:  error_state2 is:1
NOTICE:  error_state3 is:<NULL>
NOTICE:  error_state3 is:<NULL>
 pro_test
----------

(1 row)

示例3: 在存储过程中嵌套调用error_state函数。

1、创建测试表,其中字段c2是长度为3的字符串。

create table tb3 (c1 int,c2 char(3));

2、创建存储过程pro_1,其内定义了根据入参向测试表中插入一条数据。

create or replace procedure pro_1(col1 int,col2 varchar2(10))
AS
begin
insert into tb3 values(col1,col2);
end;
/

3、创建存储过程pro_2,其内嵌套调用了存储过程pro_1,并定义了TTRY…CATCH 捕捉异常。在CATCH块中调用了error_state函数用于返回错误号。

create or replace procedure pro_2(col1 int,col2 varchar2(10),col3 inout text)
as
begin
begin try
pro_1(col1,col2);
end try
begin catch
col3:=error_state();
end catch;
end ;
/

4、调用存储过程pro_2,入参设置为超出测试表tb3定义字段的长度,并查看测试表内容。

call pro_2(1,'23456','a');
select * from tb3;

由于入参不满足表字段定义的长度,调用存储过程后返回导致CATCH执行的错误号,测试表内无新增内容:

 col3
------
 1
(1 row)

 c1 | c2
----+----
(0 rows)

5、调用存储过程pro_2,入参设为满足字段定义的长度,并查看测试表内容。

call pro_2(1,'234','a');
select * from tb3;

调用存储过程后返回输入的值,测试表内新增一条数据:

 col3
------
 a
(1 row)

 c1 | c2
----+-----
  1 | 234
(1 row)

相关链接

TRY…CATCHERROR_LINEERROR_MESSAGEERROR_NUMBERERROR_PROCEDUREERROR_SEVERITY