VastbaseG100

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

Menu

ERROR_NUMBER

功能描述

Vastbase G100在SQL Server兼容模式下支持ERROR_NUMBER函数,可以针对错误处理捕获相应的错误号。此错误导致了TRY…CATCH构造的CATCH块执行。

函数作用域

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

函数返回类型

int

函数返回值

  • 在TRY…CATCH构造的CATCH块中调用ERROR_NUMBER时,返回出现错误的错误号,在Vastbase G100中以ERRCODE为此返回结果。

  • 在CATCH块的作用域之外调用ERROR_NUMBER,返回NULL

注意事项

  • 该功能仅在数据库兼容模式为SQL Server时支持(即数据库实例初始化时指定DBCOMPATIBILITY='MSSQL')。

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

  • 在嵌套CATCH块中,ERROR_NUMBER返回特定于引用它的CATCH块的作用域的错误号。

  • 调用ERROR_NUMBER函数时,()可以不加,可参考示例1

  • ERROR_NUMBER函数名大小写不敏感,调用时可为指定函数名为ERROR_number、error_NUMBER等。可参考示例1

语法格式

ERROR_NUMBER()

示例

前置步骤:

关闭GUC参数vbplsql_check,即在创建PL/pgSQL对象时不进行语义检查。此参数详细介绍参见创建PL/pgSQL对象时编译检查

set vbplsql_check to off;

示例1: 在CATCH块中调用ERROR_NUMBER函数。

1、创建存储过程pro_1,其中存在除数为0的错误,且在CATCH块中调用了ERROR_NUMBER函数。

create or replace procedure pro_1()
as
begin
begin try
select 1/0;
end try
begin catch
raise notice 'error_number is:%',ERROR_number();
dbms_output.put_line(error_NUMBER());
raise notice 'error_number is:%',ERROR_number;
dbms_output.put_line(error_NUMBER);
end catch;
end;
/

2、创建函数fun_1,其中存在除数为0的错误,且在CATCH块中调用了ERROR_NUMBER函数。

create or replace function fun_1() return void
as
begin
begin try
select 1/0;
end try
begin catch
raise notice 'error_number is:%',ERROR_NUMBER();
dbms_output.put_line(error_number());
raise notice 'error_number is:%',ERROR_number;
dbms_output.put_line(error_number);
end catch;
return;
end;
/

3、开启serveroutput参数,使信息从存储过程传输回应用程序,输出在屏幕上。

set serveroutput to on;

4、分别调用存储过程pro_1和函数fun_1。

call pro_1();
select fun_1();

由于存储过程pro_1和函数fun_1中存在错误,则当调用二者时都会返回导致CATCH执行的错误的错误号。返回结果分别如下:

NOTICE:  error_number is:33816706
33816706
NOTICE:  error_number is:33816706
33816706
 pro_1
-------

(1 row)

NOTICE:  error_number is:33816706
CONTEXT:  referenced column: fun_1
33816706
NOTICE:  error_number is:33816706
CONTEXT:  referenced column: fun_1
33816706
 fun_1
-------

(1 row)

示例2: 在CATCH块以外调用ERROR_NUMBER函数。

1、创建存储过程pro_2,其中存在除数为0的错误,在CATCH块以外的位置调用ERROR_NUMBER函数。

create or replace procedure pro_2()
as
begin
begin try
select 1/0;
end try
begin catch
raise notice 'no';
end catch;
raise notice 'error_number is:%',ERROR_number();
dbms_output.put_line(error_NUMBER());
end;
/

2、开启serveroutput参数,使信息从存储过程传输回应用程序,输出在屏幕上。

set serveroutput to on;

3、调用存储过程pro_2。

call pro_2();

存储过程pro_2中存在错误,但ERROR_NUMBER函数是在CATCH块之外被调用的,则函数返回结果为NULL。返回结果显示如下:

NOTICE:  no
NOTICE:  error_number is:<NULL>

 pro_2
-------

(1 row)

相关链接

TRY…CATCHERROR_LINEERROR_MESSAGEERROR_PROCEDUREERROR_SEVERITYERROR_STATE