FORMAT_CALL_STACK 関数 - 現行の呼び出しスタックの説明を返す
FORMAT_CALL_STACK 関数は、FORMAT_CALL_STACK が呼び出された時点の現行セッションの呼び出しスタックの状態を表すタイプ VARCHAR(32672) のストリングを返します。
許可
結果の各行は、呼び出しスタック上のアクティブ・ルーチンの説明です。 最後に呼び出されたルーチンが最初の行に示され、それより前に呼び出されたルーチンは続きの行に示されます。 したがって、先頭に最も深くネストされたルーチン、次にその呼び出し元、次にその呼び出し元の呼び出し元 (以降同様) と続く、現行の呼び出しチェーンが結果に記述されます。
関数自体の呼び出しは、報告される呼び出しスタックに含められません。
FORMAT_CALL_STACK() 関数の呼び出し時の現行セッションに、アクティブなルーチンが他にない場合、この関数は NULL を返します。
呼び出しスタックの各行の先頭は、ルーチンの先頭行 (行 1) からの相対位置を示す行番号です。そのルーチンの行番号情報を取得できない場合、その行はハイフン (「-」) で示されます。
行番号の後に、ルーチン・タイプがプロシージャー、関数、トリガー、または無名ブロック (コンパウンド・ステートメント) として示されます。 外部ルーチンも示されます。 ただし、外部プロシージャーと外部関数との間の区別はされません。 外部ルーチンの場合は、行番号情報を取得できません。
ルーチン・タイプに続いて、ルーチン・スキーマ、モジュール名 (該当する場合)、ルーチン名、そしてサブルーチン名 (該当する場合) からなる完全修飾ルーチン名が示されます。 ルーチンの完全修飾名の後に、その特定名が報告されます。 特定名のスキーマは報告されず、完全修飾ルーチン名に含まれるものと同じと見なされます。
DBMS_UTILITY モジュールに対する EXECUTE 特権。
例
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 % ルーチン C が D=0 で呼び出された場合、以下に示すレコードが 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 は行 7 のプロシージャー MYSCHEMA.B から呼び出され、この MYSCHEMA.B は行 4 のプロシージャー MYSCHEMA.A から呼び出されています。
