257 UTL_CALL_STACK
UTL_CALL_STACK
パッケージは、現在実行中のサブプログラムに関する情報を示すインタフェースを提供します。
あるファンクションは、サブプログラム名、ユニット名、所有者名、エディション名、および指定された動的深さの行番号を戻します。その他のファンクションはエラー・スタック情報を戻します。
この章のトピックは、次のとおりです:
参照:
-
条件付きコンパイルについては、『Oracle Database PL/SQL言語リファレンス』を参照してください。
-
PL/Scopeの使用およびPL/SQL階層プロファイラの使用については、『Oracle Database開発ガイド』を参照してください。
257.1 UTL_CALL_STACKの概要
UTL_CALL_STACK
パッケージは、動的および字句スタックからのサブプログラム名やこれらのスタックの深さを含め、PL/SQLプログラマが現在実行中のプログラムに関する情報を取得するためのインタフェースを提供します。
個々のファンクションは、サブプログラム名、ユニット名、所有者名、エディション名、および指定された動的深さの行番号を戻します。その他のファンクションはエラー・スタック情報を戻します。これらの情報を利用して、より意味の深いエラー・ログやアプリケーション実行トレースを作成することができます。
動的深さ
PL/SQLサブプログラムの実行インスタンスの動的深さは再帰的に定義されます。
-
現在実行中のサブプログラム・インスタンスの動的深さは1です。
-
それ以外の場合、サブプログラム・インスタンスの動的深さは、起動されたサブプログラムの動的深さよりも1つ多くなります。
-
実行中のサブプログラムを起動したか、実行中のサブプログラムによって起動されたSQL、Java、または他のPL/SQL以外のコンテキストが存在する場合、それらはサブプログラムであるかのようにコール・スタック上で1つのレベルを占有します。
A
がB
をコールし、BがC
をコールし、CがD
をコールし、DがE
をコールし、EがF
をコールし、FがE
をコールするというコール・スタックの場合、このスタックは、動的深さが下に表記されている1つの行として表現できます。
A B C D E F E 7 6 5 4 3 2 1
字句の深さ
PL/SQLサブプログラムの字句深さは再帰的に定義されます。
-
ユニット、匿名ブロック、トリガー、またはADTの字句深さは1です。
-
別のオブジェクト内で定義されたサブプログラムの字句深さは、そのオブジェクトの字句深さよりも1つ多くなります。
ブロックは字句深さに影響しません。
エラー深さ
エラー深さとは、エラー・スタック上のエラー数のことです。
たとえば、次の匿名ブロックを考えてみてください。
BEGIN BEGIN ... (1) raise zero_divide; EXCEPTION when others then raise no_data_found; END; EXCEPTION WHEN others THEN ... (2) END;
(1)のエラー深さはゼロ、(2)のエラー深さは2です。
バックトレース
バックトレースとは、例外の発生場所からバックトレースの調査場所までのトレースのことです。
AがBをコールし、BがCをコールし、Cで例外が発生するコール・スタックを考えてみてください。バックトレースがCで調査された場合、バックトレースはCというユニットを1つ持つことになり、バックトレース深さは1になります。Aで調査された場合、そのユニット数はA、B、Cの3つになり、バックトレース深さは3になります。
例外が発生しない場合、バックトレースの深さはゼロです。
257.2 UTL_CALL_STACKのセキュリティ・モデル
UTL_CALL_STACK
に対するEXECUTE
はPUBLIC
に付与されます。
UTL_CALL_STACK
パッケージは、ラップされたプログラム・ユニットを示しません。たとえば、プログラム・ユニットA
がB
をコールし、BはC
をコールし、さらにUTL_CALL_STACK
をコールしてサブプログラム・リストを決定するコール・スタックを考えます。プログラム・ユニットB
がラップされている場合、サブプログラム・リストはプログラム・ユニットC
のみを示します。
257.3 UTL_CALL_STACKの操作上のノート
UTL_CALL_STACK
には、特定の操作上のノートが適用されます。
-
コンパイラ最適化により、字句、動的およびバックトレースの深さを変更できます。
-
UTL_CALL_STACK
は、RPC境界を超えてサポートされません。たとえば、Aがリモート・プロシージャBをコールした場合、BはUTL_CALL_STACK
を使用してAに関する情報を取得できなくなります。 -
字句ユニット情報はPL/SQL条件付きコンパイル機能を通して使用可能になるため、
UTL_CALL_STACK
では公開されません。
257.4 UTL_CALL_STACKの例外
次の表に、UTL_CALL_STACK
で発生する例外を示します。
表257-1 UTL_CALL_STACKで発生する例外
例外 | エラー・コード | 説明 |
---|---|---|
|
|
この例外は、指定された深さが境界を超えている場合に発生します。動的深さと字句深さは、正の整数値です。エラー深さとバックトレース深さは負以外の整数値であり、例外がない場合にのみゼロになります。 |
257.5 UTL_CALL_STACKのデータ構造
UTL_CALL_STACK
パッケージはVARRAY
タイプ(UNIT_QUALIFIED_NAME
)を定義します。
VARRAYタイプ
257.5.1 UNIT_QUALIFIED_NAME
このデータ構造はvarrayであり、個々の要素として順番にユニット名、サブプログラムの字句親、サブプログラム名を持っています。
TYPE UNIT_QUALIFIED_NAME IS VARRAY(256) OF VARCHAR2(32767);
例
次のように設計されたPL/SQLプロシージャを考えてみましょう。
PROCEDURE topLevel IS FUNCTION localFunction(...) RETURNS VARCHAR2 IS FUNCTION innerFunction(...) RETURNS VARCHAR2 IS BEGIN DECLARE localVar PLS_INTEGER; BEGIN ... (1) END; END; BEGIN ... END;
(1)におけるユニット修飾名は次のようになります。
["topLevel", "localFunction", "innerFunction"]
ユニットが匿名ブロックであれば、ユニット名は「__anonymous_block」
となります。
257.6 UTL_CALL_STACKサブプログラムの要約
この表に、UTL_CALL_STACK
パッケージのサブプログラムをリストします。
表257-2 UTL_CALL_STACKパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
バックトレース内のバックトレースの項目数を戻します。 |
|
指定したバックトレース深さでのユニットの行番号を戻します。 |
|
指定したバックトレース深さでのユニットの名前を戻します。 |
|
指定した動的深さでのサブプログラムのユニットの現在のエディション名を戻します。 |
|
連結形式のユニット修飾名を戻します。 |
|
コール・スタック上のサブプログラム数を戻します。 |
|
エラー・スタック上のエラー数を戻します。 |
|
指定したエラー深さでのエラーのエラー・メッセージを戻します。 |
|
指定したエラー深さでのエラーのエラー番号を戻します。 |
|
指定した動的深さでのサブプログラムの字句ネスト・レベルを戻します。 |
|
指定された動的深さにおけるサブプログラムのユニットの所有者名を返します。 |
|
指定した動的深さでのサブプログラムのユニットの行番号を戻します。 |
|
指定した動的深さでのサブプログラムのユニット修飾名を戻します。 |
257.6.1 BACKTRACE_DEPTHファンクション
このファンクションは、バックトレース内のバックトレースの項目数を戻します。
構文
UTL_CALL_STACK.BACKTRACE_DEPTH RETURN PLS_INTEGER;
戻り値
バックトレース内のバックトレースの項目数であり、例外が存在しない場合はゼロになります。
257.6.2 BACKTRACE_LINEファンクション
このファンクションは、指定したバックトレース深さでのユニットの行番号を戻します。
構文
UTL_CALL_STACK.BACKTRACE_LINE ( backtrace_depth IN PLS_INTEGER) RETURN PLS_INTEGER;
パラメータ
表257-3 BACKTRACE_LINEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
バックトレースにおける深さ |
戻り値
指定したバックトレース深さでのユニットの行番号
257.6.3 BACKTRACE_UNITファンクション
このファンクションは、指定したバックトレース深さでのユニットの名前を戻します。
構文
UTL_CALL_STACK.BACKTRACE_UNIT ( backtrace_depth IN PLS_INTEGER) RETURN VARCHAR2;
パラメータ
表257-4 BACKTRACE_UNITファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
バックトレースにおける深さ |
戻り値
指定したバックトレース深さでのユニットの名前
257.6.4 CURRENT_EDITIONファンクション
このファンクションは、指定した動的深さでのサブプログラムのユニットの現在のエディション名を戻します。
構文
UTL_CALL_STACK.CURRENT_EDITION ( dynamic_depth IN PLS_INTEGER) RETURN VARCHAR2;
パラメータ
表257-5 CURRENT_EDITIONファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
エラー・スタックにおける深さ |
戻り値
指定した動的深さでのサブプログラムのユニットの現在のエディション名
257.6.5 CONCATENATE_SUBPROGRAMファンクション
このファンクションは、連結形式のユニット修飾名を戻します。
構文
UTL_CALL_STACK.CONCATENATE_SUBPROGRAM ( qualified_name IN UNIT_QUALIFIED_NAME) RETURN VARCHAR2;
パラメータ
表257-6 CONCATENATE_SUBPROGRAMファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
ユニット修飾名 |
戻り値
フォームUNIT.SUBPROGRAM.LOCAL_SUBPROGRAM
の文字列
257.6.6 DYNAMIC_DEPTHファンクション
このファンクションは、コール・スタック上のサブプログラム数を戻します。
構文
UTL_CALL_STACK.DYNAMIC_DEPTH RETURN PLS_INTEGER;
戻り値
コール・スタック上のサブプログラム数
257.6.7 ERROR_DEPTHファンクション
このファンクションは、エラー・スタック上のエラー数を戻します。
構文
UTL_CALL_STACK.ERROR_DEPTH RETURN PLS_INTEGER;
戻り値
エラー・スタック上のエラーの数
257.6.8 ERROR_MSGファンクション
このファンクションは、指定したエラー深さでのエラーのエラー・メッセージを戻します。
構文
UTL_CALL_STACK.ERROR_MSG ( error_depth IN PLS_INTEGER) RETURN VARCHAR2;
パラメータ
表257-7 ERROR_MSGファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
エラー・スタックにおける深さ |
戻り値
指定したエラー深さでのエラーのエラー・メッセージ
257.6.9 ERROR_NUMBERファンクション
このファンクションは、指定したエラー深さでのエラーのエラー番号を戻します。
構文
UTL_CALL_STACK.ERROR_NUMBER ( error_depth IN PLS_INTEGER) RETURN PLS_INTEGER;
パラメータ
表257-8 ERROR_NUMBERファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
コール・スタックにおける深さ |
戻り値
指定したエラー深さでのエラーのエラー番号
257.6.10 LEXICAL_DEPTHファンクション
このファンクションは、指定した動的深さでのサブプログラムの字句ネスト・レベルを戻します。
構文
UTL_CALL_STACK.LEXICAL_DEPTH ( dynamic_depth IN PLS_INTEGER) RETURN PLS_INTEGER;
パラメータ
表257-9 LEXICAL_DEPTHファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
コール・スタックにおける深さ |
戻り値
指定した動的深さでのサブプログラムの字句ネスト・レベル
257.6.11 OWNERファンクション
このファンクションは、指定した動的深さでのサブプログラムのユニットの所有者名を戻します。
構文
UTL_CALL_STACK.OWNER ( dynamic_depth IN PLS_INTEGER) RETURN VARCHAR2;
パラメータ
表257-10 OWNERファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
コール・スタックにおける深さ |
戻り値
指定した動的深さでのサブプログラムのユニットの所有者名
257.6.12 UNIT_LINEファンクション
このファンクションは、指定した動的深さでのサブプログラムのユニットの行番号を戻します。
構文
UTL_CALL_STACK.UNIT_LINE ( dynamic_depth IN PLS_INTEGER) RETURN PLS_INTEGER;
パラメータ
表257-11 UNIT_LINEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
コール・スタックにおける深さ |
戻り値
指定した動的深さでのサブプログラムのユニットの行番号