VastbaseG100

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

Menu

ERROR_PROCEDURE

功能描述

Vastbase G100在SQL Server兼容模式下支持ERROR_PROCEDURE函数,可以返回出现错误的存储过程或触发器的名称。该存储过程或触发器内存在的错误导致了TRY…CATCH构造的CATCH块执行。

函数返回类型

text

函数作用域

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

函数返回值

  • 在TRY…CATCH构造的CATCH块中调用ERROR_PROCEDURE时:

    • 如果存储过程或触发器中出现错误,则返回导致错误的存储过程或触发器的名称。

    • 如果存储过程或触发器中未出现错误,则返回 NULL

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

注意事项

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

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

  • 调用ERROR_PROCEDURE函数时,()可以不加。可参见示例1

语法格式

ERROR_PROCEDURE()

示例

前置步骤:

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: 在含有错误的存储过程和函数中,使用ERROR_PROCEDURE函数。

1、创建存储过程pro_1,其中存在除数为0的错误。

create or replace procedure pro_1()
as
begin
select 1/0;
end;
/

2、创建存储过程pro_2,其中调用了带有错误的存储过程pro_1,并在CATCH块中使用了ERROR_PROCEDURE函数。

create or replace procedure pro_2()
as
begin
begin try
call pro_1();
end try
begin catch
raise notice 'error_procedure is:%',ERROR_PROCEDURE();
raise notice 'error_procedure is:%',ERROR_PROCEDURE;
dbms_output.put_line(error_procedure());
dbms_output.put_line(error_procedure);
end catch;
end;
/

3、创建函数fun_1,其中调用了带有错误的存储过程pro_1,并在CATCH块中使用了ERROR_PROCEDURE函数。

create or replace function fun_1()return void
as
begin
begin try
call pro_1();
end try
begin catch
raise notice 'error_procedure is:%',ERROR_PROCEDURE();
raise notice 'error_procedure is:%',ERROR_PROCEDURE;
dbms_output.put_line(error_procedure());
dbms_output.put_line(error_procedure);
end catch;
return;
end;
/

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

set serveroutput to on;

5、调用存储过程pro_2和函数fun_1。

call pro_2();
select fun_1();

由于存储过程pro_2和函数fun_1都调用了存在错误的存储过程pro_1,则二者在被调用时,会使得CATCH块运行,且在CATCH块中了调用ERROR_PROCEDURE函数,返回结果分别如下:

NOTICE:  error_procedure is:public.pro_1()
NOTICE:  error_procedure is:public.pro_1()
public.pro_1()
public.pro_1()
 pro_2
-------

(1 row)

NOTICE:  error_procedure is:public.pro_1()
CONTEXT:  referenced column: fun_1
NOTICE:  error_procedure is:public.pro_1()
CONTEXT:  referenced column: fun_1
public.pro_1()
public.pro_1()
 fun_1
-------

(1 row)

示例2: 在无错误的存储过程和函数中,使用ERROR_PROCEDURE函数。

1、创建测试表tab_1。

create table tab_1(id int);

2、创建存储过程pro_1,并在其CATCH块中使用了ERROR_PROCEDURE函数。

create or replace procedure pro_1()
as
b1 varchar(20);
b2 varchar(20);
begin
begin try
insert into tab_1 values(1);
select ERROR_procedure into b1 from dual;
raise notice 'error1 is:%',b1;
end try
begin catch
select ERROR_procedure into b2 from dual;
raise notice 'error2 is:%',b2;
end catch;
end;
/

3、创建函数fun_1,并在其CATCH块中使用了ERROR_PROCEDURE函数。

create or replace function fun_1() return void
as
b1 varchar(20);
b2 varchar(20);
begin
begin try
insert into tab_1 values(1);
select ERROR_procedure into b1 from dual;
raise notice 'error1 is:%',b1;
end try
begin catch
select ERROR_procedure into b2 from dual;
raise notice 'error2 is:%',b2;
end catch;
return;
end;
/

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

call pro_1();
select fun_1();

由于存储过程pro_1和函数fun_1的CATCH块中调用了ERROR_PROCEDURE函数,但二者内部不存在错误,则函数返回NULL,结果分别如下:

NOTICE:  error1 is:<NULL>
 pro_1
-------

(1 row)

NOTICE:  error1 is:<NULL>
CONTEXT:  referenced column: fun_1
 fun_1
-------

(1 row)

相关链接

TRY…CATCHERROR_LINEERROR_MESSAGEERROR_NUMBERERROR_SEVERITYERROR_STATE