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该过程也可以,因此我可以在all_objects.

4

4 回答 4

35

尝试:

v_procedure_name := $$PLSQL_UNIT;

如果您想知道您所在的行号,还有 $$PLSQL_LINE 。

于 2008-11-13T08:57:13.287 回答
3

如果您是 10g 之前的版本,您可以从 dbms_utility.format_call_stack 中“挖掘”(解析)包中的过程/函数可以重载(和嵌套),因此包名称/行号通常比名称更好。

于 2008-11-13T09:45:09.417 回答
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 回答
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 回答