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时能够使用(即创建DB时DBCOMPATIBILITY='MSSQL'),在其他数据库兼容模式下不能使用该特性。
该函数依赖TRY…CATCH的逻辑完整,在PL/pgSQL语言函数中使用。
在嵌套CATCH块中,ERROR_NUMBER返回特定于引用它的CATCH块的作用域的错误号。
调用ERROR_NUMBER函数时,
()
可以不加,可参考示例1。ERROR_NUMBER函数名大小写不敏感,调用时可为指定函数名为ERROR_number、error_NUMBER等。可参考示例1。
语法格式
ERROR_NUMBER()
示例
前置步骤:
1、创建兼容模式为SQL Server的库db_sqlserver,并进入。
CREATE DATABASE db_sqlserver DBCOMPATIBILITY='MSSQL';
\c db_sqlserver
2、关闭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…CATCH、ERROR_LINE、ERROR_MESSAGE、ERROR_PROCEDURE、ERROR_SEVERITY、ERROR_STATE