2011-09-01 27 views
16

Có ai biết liệu có thể cho một thủ tục PL/SQL (một lỗi ghi nhật ký trong trường hợp này) để lấy tên của hàm/thủ tục được gọi nó?Lấy tên của thủ tục gọi hoặc hàm trong Oracle PL/SQL

Rõ ràng là tôi có thể chuyển tên vào làm tham số, nhưng thật tuyệt khi thực hiện cuộc gọi hệ thống hoặc thứ gì đó để nhận thông tin - nó có thể trả về null hoặc cái gì đó nếu nó không được gọi từ thủ tục/chức năng.

Nếu không có phương pháp nào cho việc này là tốt - chỉ cần tò mò nếu có thể (tìm kiếm không mang lại kết quả gì).

+0

@APC Cảm ơn bạn cả về đề xuất của bạn. Tôi đã xem xét proc who_called_me trong gói OWA_Util và hàm format_call_stack. Tôi chắc chắn sẽ sử dụng proc who_called_me. Một số tìm kiếm trên đó cho thấy rằng có khả năng (nhưng không phải là cách) cách nhận được chức năng thực tế/proc tên. (xem tại đây: [link] (http://tkyte.blogspot.com/2009/10) /httpasktomoraclecomtkytewhocalledme.html). Tôi cũng có thể thêm các ngăn xếp cuộc gọi trong quá, tùy thuộc vào cách 'sâu' ứng dụng này được! Trân trọng, Paul –

+0

PS - nếu bất cứ ai có thể cho tôi biết cách định dạng nhận xét trước của tôi, tôi sẽ biết ơn, đã thử một vài lần với tham chiếu đến hướng dẫn 'đánh dấu', nhưng không thể nhận được thông báo! –

Trả lời

15

Có một gói gọi OWA_UTIL (mà không được cài đặt theo mặc định trong phiên bản cũ của cơ sở dữ liệu). Phương thức này có phương thức WHO_CALLED_ME() trả về OWNER, OBJECT_NAME, LINE_NO và CALLER_TYPE. Lưu ý rằng nếu người gọi là một thủ tục đóng gói, nó sẽ trả về tên PACKAGE không phải là tên thủ tục. Trong trường hợp này không có cách nào để lấy tên thủ tục; điều này là do tên thủ tục có thể bị quá tải, vì vậy nó không nhất thiết phải rất hữu ích.

Find out more.


Vì 10gR2 cũng có chức năng đặc biệt $$PLSQL_UNIT; điều này cũng sẽ trả về TÊN ĐỐI TƯỢNG (ví dụ: quy trình đóng gói không được đóng gói).

11

Tôi đã tìm thấy diễn đàn này: http://www.orafaq.com/forum/t/60583/0/. Nó có thể là những gì bạn đang tìm kiếm.

Về cơ bản, bạn có thể sử dụng Oracle cung cấp dbms_utility.format_call_stack:

[email protected]> CREATE TABLE error_tab 
    2 (who_am_i  VARCHAR2(61), 
    3  who_called_me VARCHAR2(61), 
    4  call_stack CLOB) 
    5/

Table created. 

[email protected]> 
[email protected]> CREATE OR REPLACE PROCEDURE d 
    2 AS 
    3 v_num  NUMBER; 
    4 v_owner VARCHAR2(30); 
    5 v_name  VARCHAR2(30); 
    6 v_line  NUMBER; 
    7 v_caller_t VARCHAR2(100); 
    8 BEGIN 
    9 select to_number('a') into v_num from dual; -- cause error for testing 
10 EXCEPTION 
11 WHEN OTHERS THEN 
12  who_called_me (v_owner, v_name, v_line, v_caller_t); 
13  INSERT INTO error_tab 
14  VALUES (who_am_i, 
15   v_owner || '.' || v_name, 
16   dbms_utility.format_call_stack); 
17 END d; 
18/

Procedure created. 

[email protected]> SHOW ERRORS 
No errors. 
[email protected]> CREATE OR REPLACE PROCEDURE c 
    2 AS 
    3 BEGIN 
    4 d; 
    5 END c; 
    6/

Procedure created. 

[email protected]> CREATE OR REPLACE PROCEDURE b 
    2 AS 
    3 BEGIN 
    4 c; 
    5 END b; 
    6/

Procedure created. 

[email protected]> CREATE OR REPLACE PROCEDURE a 
    2 AS 
    3 BEGIN 
    4 b; 
    5 END a; 
    6/

Procedure created. 

[email protected]> execute a 

PL/SQL procedure successfully completed. 

[email protected]> COLUMN who_am_i FORMAT A13 
[email protected]> COLUMN who_called_me FORMAT A13 
[email protected]> COLUMN call_stack FORMAT A45 
[email protected]> SELECT * FROM error_tab 
    2/

WHO_AM_I  WHO_CALLED_ME CALL_STACK 
------------- ------------- --------------------------------------------- 
SCOTT.D  SCOTT.C  ----- PL/SQL Call Stack ----- 
           object  line object 
           handle number name 
          6623F488   1 anonymous block 
          66292138  13 procedure SCOTT.D 
          66299430   4 procedure SCOTT.C 
          6623D2F8   4 procedure SCOTT.B 
          6624F994   4 procedure SCOTT.A 
          66299984   1 anonymous block 


[email protected]> 
Các vấn đề liên quan