プライマリ・コンテンツに移動
Oracle® Database PL/SQLパッケージおよびタイプ・リファレンス
12c リリース1 (12.1)
B71281-05
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

247 UTL_CALL_STACK

UTL_CALL_STACKパッケージは、現在実行中のサブプログラムに関する情報を示すインタフェースを提供します。あるファンクションは、サブプログラム名、ユニット名、所有者名、エディション名、および指定された動的深さの行番号を戻します。その他のファンクションはエラー・スタック情報を戻します。


関連項目:

  • 条件付きコンパイルについては、『Oracle Database PL/SQL言語リファレンス』を参照してください。

  • PL/Scopeの使用およびPL/SQL階層プロファイラの使用については、『Oracle Database開発ガイド』を参照してください。


この章では、次の項目について説明します。

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になります。

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

セキュリティ・モデル

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

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

使用上の注意

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

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

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

例外

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

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

例外 エラー・コード 説明

BAD_DEPTH_INDICATOR

64610

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


データ構造

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

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

UTL_CALL_STACKサブプログラムの要約

表247-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ファンクション


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


BACKTRACE_DEPTHファンクション

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

構文

UTL_CALL_STACK.BACKTRACE_DEPTH 
 RETURN PLS_INTEGER;

戻り値

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

BACKTRACE_LINEファンクション

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

構文

UTL_CALL_STACK.BACKTRACE_LINE (
   backtrace_depth   IN   PLS_INTEGER)
 RETURN PLS_INTEGER;

パラメータ

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

パラメータ 説明

backtrace_depth

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


戻り値

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

BACKTRACE_UNITファンクション

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

構文

UTL_CALL_STACK.BACKTRACE_UNIT (
   backtrace_depth   IN   PLS_INTEGER)
 RETURN VARCHAR2;

パラメータ

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

パラメータ 説明

backtrace_depth

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


戻り値

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

CURRENT_EDITIONファンクション

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

構文

UTL_CALL_STACK.CURRENT_EDITION (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN VARCHAR2;

パラメータ

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

パラメータ 説明

dynamic_depth

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


戻り値

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

CONCATENATE_SUBPROGRAMファンクション

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

構文

UTL_CALL_STACK.CONCATENATE_SUBPROGRAM (
   qualified_name    IN    UNIT_QUALIFIED_NAME) 
 RETURN VARCHAR2;

パラメータ

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

パラメータ 説明

qualified_name

ユニット修飾名


戻り値

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

DYNAMIC_DEPTHファンクション

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

構文

UTL_CALL_STACK.DYNAMIC_DEPTH
 RETURN PLS_INTEGER;

戻り値

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

ERROR_DEPTHファンクション

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

構文

UTL_CALL_STACK.ERROR_DEPTH
 RETURN PLS_INTEGER;

戻り値

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

ERROR_MSGファンクション

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

構文

UTL_CALL_STACK.ERROR_MSG (
   error_depth    IN    PLS_INTEGER) 
 RETURN VARCHAR2;

パラメータ

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

パラメータ 説明

error_depth

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


戻り値

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

ERROR_NUMBERファンクション

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

構文

UTL_CALL_STACK.ERROR_NUMBER (
   error_depth    IN    PLS_INTEGER) 
 RETURN PLS_INTEGER;

パラメータ

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

パラメータ 説明

error_depth

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


戻り値

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

LEXICAL_DEPTHファンクション

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

構文

UTL_CALL_STACK.LEXICAL_DEPTH (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN PLS_INTEGER;

パラメータ

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

パラメータ 説明

dynamic_depth

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


戻り値

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

OWNERファンクション

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

構文

UTL_CALL_STACK.OWNER (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN VARCHAR2;

パラメータ

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

パラメータ 説明

dynamic_depth

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


戻り値

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

UNIT_LINEファンクション

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

構文

UTL_CALL_STACK.UNIT_LINE (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN PLS_INTEGER;

パラメータ

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

パラメータ 説明

dynamic_depth

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


戻り値

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

SUBPROGRAMファンクション

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

構文

UTL_CALL_STACK.SUBPROGRAM (
   dynamic_depth    IN    PLS_INTEGER) 
 RETURN UNIT_QUALIFIED_NAME;

パラメータ

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

パラメータ 説明

dynamic_depth

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


戻り値

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