FORMAT_CALL_STACK 函数 - 返回当前调用堆栈的描述
FORMAT_CALL_STACK 函数返回类型为 VARCHAR(32672) 的字符串,此字符串反映调用 FORMAT_CALL_STACK 时当前会话中调用堆栈的状态。
权限
每行结果描述了调用堆栈上的活动例程。最近调用的例程显示为第一行,后跟较晚调用的例程。因此,结果描述当前调用链,以嵌套最深的例程开头,后跟其调用程序,再后跟调用程序的调用程序,以此类推。
报告的调用堆栈中不包含函数本身的调用。
如果调用 FORMAT_CALL_STACK() 函数时,当前会话中没有其他活动例程,那么函数会返回 NULL。
每行调用堆栈以行号开始,相对例程的第一行,为行 1。如果没有提供此例程的行号信息,那么此行会显示为短划线(“-”)。
在行号后,例程类型显示为过程、函数、触发器或匿名块(复合语句)。还会显示外部例程。但是,不会区分外部过程或外部函数。没有为外部例程提供行号信息。
例程类型后跟标准例程名称:例程模式、模块名称(如果适用)、例程名称,之后是子例程名称(如果适用)。将在例程标准名称后报告其特定名称。未报告特定名称的模式,假定其与标准例程名称相同。
对 DBMS_UTILITY 模块的 EXECUTE 特权。
示例
在此示例中,FORMAT_CALL_STACK() 函数用于条件处理程序以在日志记录表中记录错误。
create global temporary table error_log(ts timestamp, message varchar(4096))
on commit preserve rows
not logged on rollback preserve rows
in error_ts %
-- ...
create procedure C(in N integer, in D integer)
language SQL
begin
declare X double;
declare continue handler for sqlexception
begin
declare message varchar(255);
declare NL char(1) default x'0a' ;
get diagnostics exception 1 message = message_text;
insert into error_log values(
current_timestamp,
'N = ' || N || '; D = ' || D || NL ||
message || NL || NL ||
'Line Routine' || NL ||
'-------- ----------------' || NL ||
dbms_utility.format_call_stack());
end;
set X = cast(N as double) / cast(D as double);
end % 如果使用 D=0 调用例程 C,那么在 ERROR_LOG 表中获取记录,如下所示:select * from error_log order by ts asc
TS MESSAGE
-------------------------- ---------------------------------------------//--
2015-01-27-14.34.30.972622 N = 10; D = 0
SQL0801N Division by zero was attempted. SQLSTATE=22012
Line Routine
-------- ----------------
13 procedure MYSCHEMA.C (specific SQL150217153125821)
7 procedure MYSCHEMA.B (specific SQL150217153126322)
4 procedure MYSCHEMA.A (specific SQL150217153126423)
1 record(s) selected.
此处,过程 C 调用自某个过程
MYSCHEMA.B 的行 7,过程 MYSCHEMA.B 又调用自过程 MYSCHEMA.A 的行 4。