2008-11-13 17 views
15

Quy trình PL/SQL có thể trong Oracle biết tên riêng của nó không?Tìm hiểu tên của thủ tục PL/SQL

Hãy để tôi giải thích:

CREATE OR REPLACE procedure some_procedure is 
    v_procedure_name varchar2(32); 
begin 
    v_procedure_name := %%something%%; 
end; 

Sau %%something%% thực thi, biến v_procedure_name nên chứa 'SOME_PROCEDURE'. Nó cũng OK nếu nó chứa object_id của thủ tục đó, vì vậy tôi có thể tra cứu tên trong all_objects.

Trả lời

26

Hãy thử:

v_procedure_name := $$PLSQL_UNIT; 

Ngoài ra còn có $$ PLSQL_LINE nếu bạn muốn biết dòng số bạn đang ở trên.

+5

Chỉ trả về tên thủ tục cho thủ tục và chức năng độc lập, nếu được gọi từ quy trình đóng gói, nó sẽ trả về tên gói. – pablo

+1

Thật vậy. Hơi khó chịu. – cagcowboy

3

Nếu bạn là pre-10g, bạn có thể 'đào' (parse) nó ra khỏi dbms_utility.format_call_stack Thủ tục/chức năng trong các gói có thể bị quá tải (và lồng nhau), do đó tên gói/số dòng thường là tốt hơn so với tên.

2

Trong 10g và 11g, tôi sử dụng chức năng "owa_util.get_procedure". Tôi thường sử dụng nó trong các gói vì nó cũng sẽ trả về tên của một thủ tục hoặc hàm nội bộ như một phần của tên gói, tức là (package_name). (Tên thủ tục). Tôi sử dụng điều này để cung cấp một mẫu chung EXCEPTION để xác định nơi xảy ra ngoại lệ.

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; 
/
+0

Điều này chỉ trả về null khi tôi thử nó. – dcp

Các vấn đề liên quan