In 12c, il nome del sottoprogramma corrente è solo:
utl_call_stack.subprogram(1)(2);
Il pacchetto corrente può anche essere ottenuto da
utl_call_stack.subprogram(1)(1);
ma generalmente è più semplice usare semplicemente $$plsql_unit
. Puoi anche ottenere il nome completo (package.procedure
) come:
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
Tuttavia , non riesco a pensare a nessuna situazione in cui una procedura o una funzione (o un metodo oggetto) vorrebbe il proprio nome. Questa funzionalità è utile principalmente in una procedura di registrazione, nel qual caso 'chi mi ha chiamato?' il codice dovrebbe essere nel logger e non ripetuto in ogni singola cosa che lo chiama. Pertanto, suggerirei caldamente di evitare qualsiasi "chi sono io?" logica nelle procedure. Invece, inserisci qualcosa di simile nel tuo logger (richiede 12.1 o versioni successive):
create or replace procedure logdemo
as
k_calling_package constant varchar2(128) := utl_call_stack.subprogram(2)(1);
k_calling_subprog constant varchar2(128) := utl_call_stack.subprogram(2)(2);
begin
dbms_output.put_line
( $$plsql_unit ||
' called from package '||k_calling_package||', subprogram '||k_calling_subprog );
end logdemo;
Sfortunatamente è un po' più complicato in 11g poiché devi analizzare dbms_utility.format_call_stack
, e poiché questo ti dà solo il nome del pacchetto e il numero di riga (in una stringa di testo delimitata da linefeed), devi quindi interrogare all_source
per trovare il nome del sottoprogramma.
Posso pubblicare del codice 11g se chiarisci a cosa serve. Nel mio logger da 11g ho trovato utile acquisire dbms_utility.format_error_backtrace
così come dbms_utility.format_call_stack
a seconda di sqlcode
ecc, quindi c'è un sacco di logica specifica per la registrazione, che potrebbe non essere necessaria se vuoi solo acquisire il nome della procedura corrente per qualche altro motivo.