Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Nome do procedimento atualmente em execução no pacote


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.