ERROR_LINE
功能描述
Vastbase G100在SQL Server兼容模式下支持ERROR_LINE函数,可以针对错误处理捕获相应的错误行。此行对应的错误导致了TRY…CATCH构造的CATCH块执行。
函数作用域
ERROR_LINE函数支持在 CATCH 块作用域内的任意位置被调用任意次。
函数返回类型
int
函数返回值
在TRY…CATCH构造的CATCH块中调用ERROR_LINE时,返回出现错误的行号。
如果在存储过程或触发器中出现错误,则返回例程中的行号,可参考示例2。
在TRY…CATCH构造的CATCH块作用域之外调用ERROR_LINE时,返回
NULL
。注意事项
该特性仅在数据库兼容模式为SQL Server时能够使用(即创建DB时DBCOMPATIBILITY='MSSQL'),在其他数据库兼容模式下不能使用该特性。
该函数依赖TRY…CATCH的逻辑完整,在PL/pgSQL语言函数中使用。
在嵌套CATCH块中,ERROR_LINE返回特定于引用它的CATCH块的作用域的错误行号。
调用ERROR_LINE函数时,
()
可以不加,可参考示例2。
语法格式
ERROR_LINE()
示例
前置步骤: 创建兼容模式为SQL Server的库db_sqlserver,并进入。
CREATE DATABASE db_sqlserver DBCOMPATIBILITY='MSSQL'; \c db_sqlserver
示例1: 在系统表PG_PROC中查询ERROR_LINE函数。
select proname from pg_proc where proname='error_line';
查询结果显示为:
proname ------------- error_line (1 row)
示例2: 分别在CATCH作用域内、外调用error_line函数。
1、创建存储过程pro_test,其中存在除数为0的错误,位于例程的第六行。分别在不同的位置调用error_line函数。
create or replace procedure pro_test() as begin begin try raise notice 'error_line1 is:%',error_line(); raise notice 'error_line1 is:%',error_line; select 1/0; end try begin catch raise notice 'error_line2 is:%',error_line(); raise notice 'error_line2 is:%',error_line; end catch; raise notice 'error_line3 is:%',error_line(); raise notice 'error_line3 is:%',error_line; end ; /
2、调用存储过程。
call pro_test();
只有在CATCH块中调用的error_line函数返回的是例程中错误所在行号,其余都返回
NULL
。返回结果分别为:NOTICE: error_line1 is:<NULL> NOTICE: error_line1 is:<NULL> NOTICE: error_line2 is:6 NOTICE: error_line2 is:6 NOTICE: error_line3 is:<NULL> NOTICE: error_line3 is:<NULL> pro_test ---------- (1 row)
示例3: 在存储过程中设置error_line作为函数出参。
1、创建存储过程pro_1,其中存在除数为0的错误。在try语句中包含了三个空行,将错误的行号控制在例程的第七行。
create or replace procedure pro_1(c1 inout int,out c2 int) as begin begin try select c1/0; end try begin catch raise notice '%',error_line(); c1:=error_line(); c2:=error_line; end catch; end ; /
2、调用存储过程pro_1。
call pro_1(3,3);
由于存储过程中存在错误,调用存储过程后返回导致CATCH执行的错误在例程中的行号:
NOTICE: 7 c1 | c2 ----+---- 7 | 7 (1 row)
相关链接
TRY…CATCH、ERROR_MESSAGE、ERROR_NUMBER、ERROR_PROCEDURE、ERROR_SEVERITY、ERROR_STATE