Узнать название процедуры PL/SQL

Может ли процедура PL/SQL в Oracle узнать собственное имя?

Позвольте мне объяснить:

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 этой процедуры, поэтому я могу найти имя в all_objects.

Ответы

Ответ 1

Try:

v_procedure_name := $$PLSQL_UNIT;

Там также $$ PLSQL_LINE, если вы хотите узнать, какой номер строки вы находитесь.

Ответ 2

Если вы до 10 г, вы можете "выкопать" (разобрать) его из dbms_utility.format_call_stack Процедуры/функции в пакетах могут быть перегружены (и вложены), поэтому номер/номер пакета обычно лучше, чем имя.

Ответ 3

В 10g и 11g я использую функцию owa_util.get_procedure. Обычно я использую это в пакетах, так как он также возвращает имя внутренней процедуры или функции как часть имени пакета, т.е. (Имя_пакета). (Имя процедуры). Я использую это, чтобы предоставить общий шаблон 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;
/