2008-11-13 38 views
15

Oracle中的PL/SQL程序是否知道它是自己的名字?找出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中查找名稱。

回答

26

嘗試:

v_procedure_name := $$PLSQL_UNIT; 

還有,如果你想知道你是哪個行號$$ PLSQL_LINE。

+5

僅返回獨立過程和函數的過程名稱,如果從打包過程中調用,則返回包名稱。 – pablo 2008-11-13 09:30:59

+1

確實。有點刺激。 – cagcowboy 2008-11-13 09:50:16

3

如果是預先10g中,可以「挖」(分析)出來 dbms_utility.format_call_stack在包 程序/功能可以被重載(和嵌套),所以包名稱/行號通常是更好比名字。

2

在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; 
/