Узнать название процедуры PL / SQL - PullRequest
17 голосов
/ 13 ноября 2008

Может ли процедура 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.

Ответы [ 4 ]

31 голосов
/ 13 ноября 2008

Попробуйте:

v_procedure_name := $$PLSQL_UNIT;

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

3 голосов
/ 09 сентября 2013

В 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;
/
3 голосов
/ 13 ноября 2008

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

0 голосов
/ 16 июля 2018

Вот аккуратная функция, которая использует 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...