Em 12c, o nome do subprograma atual é apenas:
utl_call_stack.subprogram(1)(2);
O pacote atual também pode ser obtido em
utl_call_stack.subprogram(1)(1);
mas geralmente é mais fácil usar apenas
$$plsql_unit
. Você também pode obter o nome qualificado (package.procedure
) Como:utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
No entanto , não consigo pensar em nenhuma situação em que um procedimento ou função (ou método de objeto) queira seu próprio nome. Esta funcionalidade é útil principalmente em um procedimento de registro, caso em que o 'quem me chamou?' o código deve estar no logger e não repetido em cada coisa que o chama. Portanto, sugiro fortemente evitar qualquer 'quem sou eu?' lógica nos procedimentos. Em vez disso, coloque algo assim em seu logger (requer 12.1 ou posterior):
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;
Infelizmente, é um pouco mais complicado em 11g, pois você precisa analisar
dbms_utility.format_call_stack
, e como isso fornece apenas o nome do pacote e o número da linha (em uma string de texto delimitada por feed de linha), você deve consultar all_source
para encontrar o nome do subprograma. Posso postar algum código 11g se você esclarecer para que serve. No meu logger 11g achei útil capturar
dbms_utility.format_error_backtrace
bem como dbms_utility.format_call_stack
dependendo de sqlcode
etc, portanto, há um monte de lógica específica para log, que você pode não precisar se quiser apenas capturar o nome do procedimento atual por algum outro motivo.