12cでは、現在のサブプログラム名は次のとおりです。
utl_call_stack.subprogram(1)(2);
現在のパッケージは
から入手することもできますutl_call_stack.subprogram(1)(1);
ただし、一般的には$$plsql_unit
を使用する方が簡単です。 。修飾名(package.procedure
)を取得することもできます )as:
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
ただし 、プロシージャまたは関数(またはオブジェクトメソッド)が独自の名前を必要とする状況は考えられません。この機能は、ログ記録手順で主に役立ちます。その場合、「誰が私を呼んだのですか?」 コードはロガーにあるべきであり、それを呼び出すすべてのもので繰り返されるべきではありません。したがって、「私は誰ですか?」を避けることを強くお勧めします。 プロシージャのロジック。代わりに、次のようなものをロガーに入れてください(12.1以降が必要です):
create or replace procedure logdemo
as
k_calling_package constant varchar2(128) := utl_call_stack.subprogram(2)(1);
k_calling_subprog constant varchar2(128) := utl_call_stack.subprogram(2)(2);
begin
dbms_output.put_line
( $$plsql_unit ||
' called from package '||k_calling_package||', subprogram '||k_calling_subprog );
end logdemo;
残念ながら、dbms_utility.format_call_stack
を解析する必要があるため、11gでは少し複雑になります。 、これはパッケージ名と行番号(改行で区切られたテキスト文字列)のみを提供するため、all_source
をクエリする必要があります。 サブプログラム名を検索します。
目的を明確にすれば、11gのコードを投稿できます。私の11gロガーでは、dbms_utility.format_error_backtrace
をキャプチャすると便利であることがわかりました。 dbms_utility.format_call_stack
も同様です sqlcode
によって異なります など、ロギングに固有のロジックがたくさんありますが、他の理由で現在のプロシージャ名をキャプチャするだけの場合は必要ない場合があります。