2011-09-01 10 views
16

Qualcuno sa se è possibile una procedura PL/SQL (una registrazione errori in questo caso) per ottenere il nome della funzione/procedura che ha chiamato vero?Ottenere il nome della procedura o della funzione di chiamata in Oracle PL/SQL

Ovviamente potrei passare il nome come parametro, ma sarebbe bello effettuare una chiamata di sistema o qualcosa per ottenere le informazioni - potrebbe solo restituire null o qualcosa se non è stato chiamato da una procedura/funzione.

Se non c'è alcun metodo per questo va bene - solo curioso se è possibile (le ricerche non producono nulla).

+0

@APC Grazie a tutti e due per i vostri suggerimenti. Ho esaminato il processo who_called_me nel pacchetto OWA_Util e la funzione format_call_stack. Utilizzerò sicuramente il proc who_called_me. Alcune ricerche su questo hanno dimostrato che esistono dei modi potenziali (ma non infallibili) per ottenere il nome effettivo della funzione/proc. (vedi qui: [link] (http://tkyte.blogspot.com/2009/10) /httpasktomoraclecomtkytewhocalledme.html). Potrei anche aggiungere lo stack delle chiamate, a seconda di quanto 'profonda' questa applicazione! Cordiali saluti, Paul –

+0

PS: se qualcuno potesse dirmi come formattare il mio commento precedente, sarei grato, ho provato alcune volte con riferimento alla guida "markdown", ma non riesco a visualizzare gli interruzioni di riga! –

risposta

15

C'è un pacchetto chiamato OWA_UTIL (che non è installato di default nelle versioni precedenti di database). Questo ha un metodo WHO_CALLED_ME() che restituisce PROPRIETARIO, OBJECT_NAME, LINE_NO e CALLER_TYPE. Si noti che se il chiamante è una procedura impacchettata restituirà il nome PACKAGE e non il nome della procedura. In questo caso non c'è modo di ottenere il nome della procedura; questo perché il nome della procedura può essere sovraccaricato, quindi non è necessariamente molto utile.

Find out more.


Da 10gR2 c'è anche la funzione speciale $$PLSQL_UNIT; questo restituirà anche OBJECT NAME (cioè la procedura del pacchetto non pacchettizzato).

11

Ho trovato questo forum: http://www.orafaq.com/forum/t/60583/0/. Potrebbe essere quello che stai cercando.

In sostanza, è possibile utilizzare Oracle fornito 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]> 
Problemi correlati