2011-09-01 11 views
16

Czy ktoś wie, czy możliwe jest wykonanie procedury PL/SQL (w tym przypadku rejestrowanie błędów) w celu uzyskania nazwy funkcji/procedury, która wywołała to?Uzyskaj nazwę procedury wywołania lub funkcji w Oracle PL/SQL

Oczywiście mogłem podać nazwę jako parametr, ale byłoby miło wykonać wywołanie systemowe lub coś w celu uzyskania informacji - mógł po prostu zwrócić wartość zerową lub coś, co nie zostało wywołane z procedury/funkcjonować.

Jeśli nie ma na to żadnej metody, to po prostu ciekawa, jeśli to możliwe (wyszukiwania niczego nie dają).

+0

@APC Dziękuję za sugestie. Sprawdziłem proces who_called_me w pakiecie OWA_Util i funkcję format_call_stack. Zdecydowanie skorzystam z proceury who_called_me. Niektóre wyszukiwania na ten temat wykazały, że istnieją potencjalne (ale nie niezawodnie) sposoby uzyskiwania faktycznej nazwy funkcji/proc. (zobacz tutaj: [link] (http://tkyte.blogspot.com/2009/10) /httpasktomoraclecomtkytewhocalledme.html). Mogę też dodać stos wywoławczy, w zależności od tego, jak "głęboka" jest ta aplikacja! Pozdrawiam, Paul –

+0

PS - jeśli ktoś mógłby mi powiedzieć, jak sformatować mój poprzedni komentarz, byłbym wdzięczny, kilka razy próbowałam w odniesieniu do przewodnika "obniżki cen", ale nie można wyświetlić linków! –

Odpowiedz

15

Jest to pakiet o nazwie OWA_UTIL (który nie jest instalowany domyślnie w starszych wersjach bazy danych). Ma to metodę WHO_CALLED_ME(), która zwraca OWNER, OBJECT_NAME, LINE_NO i CALLER_TYPE. Zauważ, że jeśli wywołujący jest procedurą pakowaną, zwróci nazwę PACKAGE, a nie nazwę procedury. W tym przypadku nie ma możliwości uzyskania nazwy procedury; dzieje się tak dlatego, że nazwa procedury może być przeciążona, więc niekoniecznie jest bardzo przydatna.

Find out more.


Od 10gR2 istnieje również specjalna funkcja $$PLSQL_UNIT; spowoduje to również zwrócenie NAZWY OBIEKTU (tj. procedura pakietowa niezapakowana).

11

Znalazłem to forum: http://www.orafaq.com/forum/t/60583/0/. To może być to, czego szukasz.

Zasadniczo można użyć Oracle dostarczany 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]> 
Powiązane problemy