18

Oracle の PL/SQL プロシージャは、それ自体の名前を認識できますか?

説明させてください:

CREATE OR REPLACE procedure some_procedure is
    v_procedure_name varchar2(32);
begin
    v_procedure_name := %%something%%;
end;

実行後%%something%%、変数v_procedure_nameには「SOME_PROCEDURE」が含まれている必要があります。object_idその手順が含まれていてもOKなので、 で名前を調べることができますall_objects

4

4 に答える 4

35

試す:

v_procedure_name := $$PLSQL_UNIT;

現在の行番号を知りたい場合は、$$PLSQL_LINE もあります。

于 2008-11-13T08:57:13.287 に答える
3

10g と 11g では、「owa_util.get_procedure」関数を使用します。パッケージ名の一部として内部プロシージャまたは関数の名前、つまり (package_name).(procedure name) も返すため、通常はパッケージでこれを使用します。EXCEPTIONこれを使用して、例外が発生した場所を特定するための汎用テンプレートを提供します。

CREATE OR REPLACE procedure some_procedure is
    v_procedure_name varchar2(32);
begin
    v_procedure_name := owa_util.get_procedure;
end;

CREATE OR REPLACE PACKAGE some_package
AS
    FUNCTION v_function_name
    RETURN DATE;
END;
/
CREATE OR REPLACE PACKAGE BODY some_package
AS
    FUNCTION v_function_name
    RETURN DATE
    IS
    BEGIN
        RETURN SYSDATE;
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('ERROR IN '||owa_util.get_procedure);
            DBMS_OUTPUT.PUT_LINE(SQLERRM);
    END;
END;
/
于 2013-09-09T19:00:46.323 に答える
3

10g より前の場合は、dbms_utility.format_call_stack から「掘り出す」(解析する) ことができます。パッケージ内のプロシージャ/関数はオーバーロード (およびネスト) できるため、通常、パッケージ名/行番号は名前よりも適切です。

于 2008-11-13T09:45:09.417 に答える
0

これは、REGEXP_SUBSTR を利用した便利な関数です。パッケージでテストしました(パッケージ内の別のプロシージャが呼び出した場合でも機能します):

FUNCTION SET_PROC RETURN VARCHAR2 IS
BEGIN
  RETURN NVL(REGEXP_SUBSTR(DBMS_UTILITY.FORMAT_CALL_STACK, 
             'procedure.+\.(.+)\s', 1,1,'i',1), 'UNDEFINED');
END SET_PROC;
于 2018-07-16T18:42:58.693 に答える