FORMAT_ERROR_BACKTRACE 函数 - 返回最近发生错误时调用堆栈的描述
FORMAT_ERROR_BACKTRACE 函数返回类型为 VARCHAR(32672) 的字符串,此字符串反映当前会话期间在 SQL 例程中最近发生错误时调用堆栈的状态。
权限
每行结果描述了发生错误时调用堆栈上的活动例程;最近调用的例程显示为第一行,后跟较晚调用的例程。换句话说,结果描述发生错误时的调用链,以嵌套最深的例程开头,后跟其调用程序,再后跟调用程序的调用程序,以此类推。
如果当前会话期间 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.
