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
中查找名称。
答案 0 :(得分:31)
尝试:
v_procedure_name := $$PLSQL_UNIT;
如果你想知道你在哪个行号,还有$$ PLSQL_LINE。
答案 1 :(得分:3)
如果你是10g之前,你可以'挖掘'(解析)它 dbms_utility.format_call_stack 包中的过程/函数可以重载(和嵌套),因此包名/行号通常比名称更好。
答案 2 :(得分:3)
在10g和11g中,我使用“owa_util.get_procedure”函数。我通常在包中使用它,因为它还会返回内部过程或函数的名称作为包名称的一部分,即(package_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;
/
答案 3 :(得分: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;