日本語PDF

261 UTL_CALL_STACK

UTL_CALL_STACKパッケージは、現在実行中のサブプログラムに関する情報を示すインタフェースを提供します。

あるファンクションは、サブプログラム名、ユニット名、所有者名、エディション名、および指定された動的深さの行番号を戻します。その他のファンクションはエラー・スタック情報を戻します。

この章のトピックは、次のとおりです:

参照:

261.1 UTL_CALL_STACKの概要

UTL_CALL_STACKパッケージは、動的および字句スタックからのサブプログラム名やこれらのスタックの深さを含め、PL/SQLプログラマが現在実行中のプログラムに関する情報を取得するためのインタフェースを提供します。

個々のファンクションは、サブプログラム名、ユニット名、所有者名、エディション名、および指定された動的深さの行番号を戻します。その他のファンクションはエラー・スタック情報を戻します。これらの情報を利用して、より意味の深いエラー・ログやアプリケーション実行トレースを作成することができます。

動的深さ

PL/SQLサブプログラムの実行インスタンスの動的深さは再帰的に定義されます。

  • 現在実行中のサブプログラム・インスタンスの動的深さは1です。

  • それ以外の場合、サブプログラム・インスタンスの動的深さは、起動されたサブプログラムの動的深さよりも1つ多くなります。

  • 実行中のサブプログラムを起動したか、実行中のサブプログラムによって起動されたSQL、Java、または他のPL/SQL以外のコンテキストが存在する場合、それらはサブプログラムであるかのようにコール・スタック上で1つのレベルを占有します。

ABをコールし、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になります。

例外が発生しない場合、バックトレースの深さはゼロです。

261.2 UTL_CALL_STACKのセキュリティ・モデル

UTL_CALL_STACKに対するEXECUTEPUBLICに付与されます。

UTL_CALL_STACKパッケージは、ラップされたプログラム・ユニットを示しません。たとえば、プログラム・ユニットABをコールし、BはCをコールし、さらにUTL_CALL_STACKをコールしてサブプログラム・リストを決定するコール・スタックを考えます。プログラム・ユニットBがラップされている場合、サブプログラム・リストはプログラム・ユニットCのみを示します。

261.3 UTL_CALL_STACKの操作上のノート

UTL_CALL_STACKには、特定の操作上のノートが適用されます。

  • コンパイラ最適化により、字句、動的およびバックトレースの深さを変更できます。

  • UTL_CALL_STACKは、RPC境界を超えてサポートされません。たとえば、Aがリモート・プロシージャBをコールした場合、BはUTL_CALL_STACKを使用してAに関する情報を取得できなくなります。

  • 字句ユニット情報はPL/SQL条件付きコンパイル機能を通して使用可能になるため、UTL_CALL_STACKでは公開されません。

261.4 UTL_CALL_STACKの例外

次の表に、UTL_CALL_STACKで発生する例外を示します。

表261-1 UTL_CALL_STACKで発生する例外

例外 エラー・コード 説明

BAD_DEPTH_INDICATOR

64610

この例外は、指定された深さが境界を超えている場合に発生します。動的深さと字句深さは、正の整数値です。エラー深さとバックトレース深さは負以外の整数値であり、例外がない場合にのみゼロになります。

261.5 UTL_CALL_STACKのデータ構造

UTL_CALL_STACKパッケージはVARRAYタイプ(UNIT_QUALIFIED_NAME)を定義します。

VARRAYタイプ

261.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」 となります。

261.6 UTL_CALL_STACKサブプログラムの要約

この表に、UTL_CALL_STACKパッケージのサブプログラムをリストします。

表261-2 UTL_CALL_STACKパッケージのサブプログラム

サブプログラム 説明

BACKTRACE_DEPTHファンクション

バックトレース内のバックトレースの項目数を戻します。

BACKTRACE_LINEファンクション

指定したバックトレース深さでのユニットの行番号を戻します。

BACKTRACE_UNITファンクション

指定したバックトレース深さでのユニットの名前を戻します。

CURRENT_EDITIONファンクション

指定した動的深さでのサブプログラムのユニットの現在のエディション名を戻します。

CONCATENATE_SUBPROGRAMファンクション

連結形式のユニット修飾名を戻します。

DYNAMIC_DEPTHファンクション

コール・スタック上のサブプログラム数を戻します。

ERROR_DEPTHファンクション

エラー・スタック上のエラー数を戻します。

ERROR_MSGファンクション

指定したエラー深さでのエラーのエラー・メッセージを戻します。

ERROR_NUMBERファンクション

指定したエラー深さでのエラーのエラー番号を戻します。

LEXICAL_DEPTHファンクション

指定した動的深さでのサブプログラムの字句ネスト・レベルを戻します。

OWNERファンクション

指定された動的深さにおけるサブプログラムのユニットの所有者名を返します。

UNIT_LINEファンクション

指定した動的深さでのサブプログラムのユニットの行番号を戻します。

SUBPROGRAMファンクション

指定した動的深さでのサブプログラムのユニット修飾名を戻します。

261.6.1 BACKTRACE_DEPTHファンクション

このファンクションは、バックトレース内のバックトレースの項目数を戻します。

構文

UTL_CALL_STACK.BACKTRACE_DEPTH 
 RETURN PLS_INTEGER;

戻り値

バックトレース内のバックトレースの項目数であり、例外が存在しない場合はゼロになります。

261.6.2 BACKTRACE_LINEファンクション

このファンクションは、指定したバックトレース深さでのユニットの行番号を戻します。

構文

UTL_CALL_STACK.BACKTRACE_LINE (
   backtrace_depth   IN   PLS_INTEGER)
 RETURN PLS_INTEGER;

パラメータ

表261-3 BACKTRACE_LINEファンクションのパラメータ

パラメータ 説明

backtrace_depth

バックトレースにおける深さ

戻り値

指定したバックトレース深さでのユニットの行番号

261.6.3 BACKTRACE_UNITファンクション

このファンクションは、指定したバックトレース深さでのユニットの名前を戻します。

構文

UTL_CALL_STACK.BACKTRACE_UNIT (
   backtrace_depth   IN   PLS_INTEGER)
 RETURN VARCHAR2;

パラメータ

表261-4 BACKTRACE_UNITファンクションのパラメータ

パラメータ 説明

backtrace_depth

バックトレースにおける深さ

戻り値

指定したバックトレース深さでのユニットの名前

261.6.4 CURRENT_EDITIONファンクション

このファンクションは、指定した動的深さでのサブプログラムのユニットの現在のエディション名を戻します。

構文

UTL_CALL_STACK.CURRENT_EDITION (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN VARCHAR2;

パラメータ

表261-5 CURRENT_EDITIONファンクションのパラメータ

パラメータ 説明

dynamic_depth

エラー・スタックにおける深さ

戻り値

指定した動的深さでのサブプログラムのユニットの現在のエディション名

261.6.5 CONCATENATE_SUBPROGRAMファンクション

このファンクションは、連結形式のユニット修飾名を戻します。

構文

UTL_CALL_STACK.CONCATENATE_SUBPROGRAM (
   qualified_name    IN    UNIT_QUALIFIED_NAME) 
 RETURN VARCHAR2;

パラメータ

表261-6 CONCATENATE_SUBPROGRAMファンクションのパラメータ

パラメータ 説明

qualified_name

ユニット修飾名

戻り値

フォームUNIT.SUBPROGRAM.LOCAL_SUBPROGRAMの文字列

261.6.6 DYNAMIC_DEPTHファンクション

このファンクションは、コール・スタック上のサブプログラム数を戻します。

構文

UTL_CALL_STACK.DYNAMIC_DEPTH
 RETURN PLS_INTEGER;

戻り値

コール・スタック上のサブプログラム数

261.6.7 ERROR_DEPTHファンクション

このファンクションは、エラー・スタック上のエラー数を戻します。

構文

UTL_CALL_STACK.ERROR_DEPTH
 RETURN PLS_INTEGER;

戻り値

エラー・スタック上のエラーの数

261.6.8 ERROR_MSGファンクション

このファンクションは、指定したエラー深さでのエラーのエラー・メッセージを戻します。

構文

UTL_CALL_STACK.ERROR_MSG (
   error_depth    IN    PLS_INTEGER) 
 RETURN VARCHAR2;

パラメータ

表261-7 ERROR_MSGファンクションのパラメータ

パラメータ 説明

error_depth

エラー・スタックにおける深さ

戻り値

指定したエラー深さでのエラーのエラー・メッセージ

261.6.9 ERROR_NUMBERファンクション

このファンクションは、指定したエラー深さでのエラーのエラー番号を戻します。

構文

UTL_CALL_STACK.ERROR_NUMBER (
   error_depth    IN    PLS_INTEGER) 
 RETURN PLS_INTEGER;

パラメータ

表261-8 ERROR_NUMBERファンクションのパラメータ

パラメータ 説明

error_depth

コール・スタックにおける深さ

戻り値

指定したエラー深さでのエラーのエラー番号

261.6.10 LEXICAL_DEPTHファンクション

このファンクションは、指定した動的深さでのサブプログラムの字句ネスト・レベルを戻します。

構文

UTL_CALL_STACK.LEXICAL_DEPTH (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN PLS_INTEGER;

パラメータ

表261-9 LEXICAL_DEPTHファンクションのパラメータ

パラメータ 説明

dynamic_depth

コール・スタックにおける深さ

戻り値

指定した動的深さでのサブプログラムの字句ネスト・レベル

261.6.11 OWNERファンクション

このファンクションは、指定した動的深さでのサブプログラムのユニットの所有者名を戻します。

構文

UTL_CALL_STACK.OWNER (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN VARCHAR2;

パラメータ

表261-10 OWNERファンクションのパラメータ

パラメータ 説明

dynamic_depth

コール・スタックにおける深さ

戻り値

指定した動的深さでのサブプログラムのユニットの所有者名

261.6.12 UNIT_LINEファンクション

このファンクションは、指定した動的深さでのサブプログラムのユニットの行番号を戻します。

構文

UTL_CALL_STACK.UNIT_LINE (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN PLS_INTEGER;

パラメータ

表261-11 UNIT_LINEファンクションのパラメータ

パラメータ 説明

dynamic_depth

コール・スタックにおける深さ

戻り値

指定した動的深さでのサブプログラムのユニットの行番号

261.6.13 SUBPROGRAMファンクション

このファンクションは、指定した動的深さでのサブプログラムのユニット修飾名を戻します。

構文

UTL_CALL_STACK.SUBPROGRAM (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN UNIT_QUALIFIED_NAME;

パラメータ

表261-12 SUBPROGRAMファンクションのパラメータ

パラメータ 説明

dynamic_depth

コール・スタックにおける深さ

戻り値

指定した動的深さでのサブプログラムのユニット修飾名を戻します。