FORMAT_CALL_STACK 函数 - 返回当前调用堆栈的描述

FORMAT_CALL_STACK 函数返回类型为 VARCHAR(32672) 的字符串,此字符串反映调用 FORMAT_CALL_STACK 时当前会话中调用堆栈的状态。

阅读语法图跳过直观语法图DBMS_UTILITY.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。