FORMAT_ERROR_BACKTRACE 函数 - 返回最近发生错误时调用堆栈的描述

FORMAT_ERROR_BACKTRACE 函数返回类型为 VARCHAR(32672) 的字符串,此字符串反映当前会话期间在 SQL 例程中最近发生错误时调用堆栈的状态。

阅读语法图跳过直观语法图DBMS_UTILITY.FORMAT_ERROR_BACKTRACE ()

权限

每行结果描述了发生错误时调用堆栈上的活动例程;最近调用的例程显示为第一行,后跟较晚调用的例程。换句话说,结果描述发生错误时的调用链,以嵌套最深的例程开头,后跟其调用程序,再后跟调用程序的调用程序,以此类推。

如果当前会话期间 SQL 例程未遇到错误,那么函数会返回 NULL。

每行调用堆栈以行号开始,相对例程的第一行,为行 1。如果没有提供此例程的行号信息,那么此行会显示为短划线(“-”)。

在行号后,例程类型显示为过程、函数、触发器或匿名块(复合语句)。还会显示外部例程;但是,不会区分外部过程或外部函数。没有为外部例程提供行号信息。

例程类型后跟标准例程名称、例程模式、模块名称(如果适用)、例程名称,之后是子例程名称(如果适用)。将在例程标准名称后报告其特定名称。未报告特定名称的模式,假定其与标准例程名称相同。

对 DBMS_UTILITY 模块的 EXECUTE 特权。

示例

以下嵌套调用方案返回错误。
create table T1(C1 integer, C2 integer, tag varchar(32)) @ 
insert into T1 values (1, 6, 'VI'), (2, 10, 'X'), (3, 11, 'XI'), (4, 48, 'XLVIII') @ 

create or replace procedure B( 
in colname varchar(128), 
in value integer, 
in tag varchar(32)) 
language SQL 
begin 
declare stmt_text varchar(256); 
declare S1 statement; 

set stmt_text = 'update T1 set tag = ? where ' || colname || ' = ?'; 
prepare S1 from stmt_text; 
execute S1 using tag, value; 
end @ 

create or replace procedure A() 
begin 
call B('C1', 1, 'six'); 
call B('C2', 11, 'eleven'); 
call B('C3', 0, 'zero'); -- will produce an error 
call B('C2', 48, 'forty-eight'); 
end @ 

begin 
call A; 
end @ 
DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: 
SQL0206N "C3" is not valid in the context where it is used. SQLSTATE=42703 
发生错误后,FORMAT_ERROR_BACKTRACE 会返回类似以下内容的信息:
values dbms_utility.format_error_backtrace() 

1 
-----------------------------------------------------------------------//-- 
11 procedure MYSCHEMA.B (specific SQL150217153622825); SQLCODE=-206 
5 procedure MYSCHEMA.A (specific SQL150217153623026) 
2 anonymous block (specific SQL150217153624330) 

1 record(s) selected.