sql >> データベース >  >> RDS >> Oracle

パッケージ内で現在実行中のプロシージャ名

    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によって異なります など、ロギングに固有のロジックがたくさんありますが、他の理由で現在のプロシージャ名をキャプチャするだけの場合は必要ない場合があります。



    1. MySQLでSUBSTRING()を使用する方法

    2. MySQLクエリ最適化-内部クエリ

    3. MySQL全文検索が一致しません

    4. MySQLでの列値の交換