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になります。
例外が発生しない場合、バックトレースの深さはゼロです。
UTL_CALL_STACK
に対するEXECUTE
はPUBLIC
に付与されます。
UTL_CALL_STACK
パッケージは、ラップされたプログラム・ユニットを示しません。たとえば、プログラム・ユニットA
がB
をコールし、BはC
をコールし、さらにUTL_CALL_STACK
をコールしてサブプログラム・リストを決定するコール・スタックを考えます。プログラム・ユニットB
がラップされている場合、サブプログラム・リストはプログラム・ユニットC
のみを示します。
UTL_CALL_STACK
パッケージはVARRAY
タイプ(UNIT_QUALIFIED_NAME
)を定義します。
TYPE UNIT_QUALIFIED_NAME IS VARRAY(256) OF VARCHAR2(32767);
このデータ構造はvarrayであり、個々の要素として順番にユニット名、サブプログラムの字句親、サブプログラム名を持っています。
例
次のように設計された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」
となります。
表247-2 UTL_CALL_STACKパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
|
バックトレース内のバックトレースの項目数を戻します。 |
|
指定したバックトレース深さでのユニットの行番号を戻します。 |
|
指定したバックトレース深さでのユニットの名前を戻します。 |
|
指定した動的深さでのサブプログラムのユニットの現在のエディション名を戻します。 |
|
連結形式のユニット修飾名を戻します。 |
|
コール・スタック上のサブプログラム数を戻します。 |
|
エラー・スタック上のエラー数を戻します。 |
|
指定したエラー深さでのエラーのエラー・メッセージを戻します。 |
|
指定したエラー深さでのエラーのエラー番号を戻します。 |
|
指定した動的深さでのサブプログラムの字句ネスト・レベルを戻します。 |
|
指定された動的深さにおけるサブプログラムのユニットの所有者名を返します。 |
|
指定した動的深さでのサブプログラムのユニットの行番号を戻します。 |
|
指定した動的深さでのサブプログラムのユニット修飾名を戻します。 |