sql >> Base de Datos >  >> RDS >> Oracle

Nombre del procedimiento actualmente en ejecución dentro del paquete

En 12c, el nombre del subprograma actual es simplemente:

utl_call_stack.subprogram(1)(2);

El paquete actual también se puede obtener de

utl_call_stack.subprogram(1)(1);

pero generalmente es más fácil usar $$plsql_unit . También puede obtener el nombre calificado (package.procedure ) como:

utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));

Sin embargo , no puedo pensar en ninguna situación en la que un procedimiento o función (o método de objeto) quiera su propio nombre. Esta funcionalidad es principalmente útil en un procedimiento de registro, en cuyo caso el '¿quién me llamó?' el código debe estar en el registrador y no repetirse en cada cosa que lo llama. Por lo tanto, sugiero encarecidamente evitar cualquier "¿quién soy yo?" lógica en los procedimientos. En su lugar, ponga algo como esto en su registrador (requiere 12.1 o 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;

Lamentablemente, es un poco más complicado en 11g, ya que debe analizar dbms_utility.format_call_stack , y como esto solo le proporciona el nombre del paquete y el número de línea (en una cadena de texto delimitada por salto de línea), debe consultar all_source para encontrar el nombre del subprograma.

Puedo publicar un código 11g si aclaras para qué sirve. En mi registrador de 11g me resultó útil capturar dbms_utility.format_error_backtrace así como dbms_utility.format_call_stack dependiendo de sqlcode etc., por lo que hay un montón de lógica que es específica para el registro, que es posible que no necesite si solo desea capturar el nombre del procedimiento actual por algún otro motivo.