Как получить имя выполняющейся в данный момент процедуры в пакете?
Есть ли способ, получить имя выполняющейся в данный момент процедуры в пакете?
create or replace package pack1 as
procedure proc1;
end pack1;
/
create or replace package body pack1 as
procedure proc1 is
begin
/** Какoe мoe имя? */
end proc1;
end pack1;
Свободный перевод вопроса Currently Executing Procedure Name within the Package от участника @sqlpractice
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Избегатйте логики: "Как меня зовут?" в самих процедурах, функциях или методах. Трудно представить ситуацию, когда она там нужна. Поместите эту логику в отдельный логгер.
Для этого воспользуйтесь UTL_CALL_STACK или $$PLSQL_UNIT. Воспроизводимый пример:
create or replace package pack1 as
procedure proc1;
procedure proc2;
procedure logger;
end pack1;
/
create or replace package body pack1 as
procedure logger is
begin
dbms_output.put_line ('# unit:'||$$plsql_unit||
' iam '||utl_call_stack.concatenate_subprogram (
utl_call_stack.subprogram(1))||
' called from '||utl_call_stack.concatenate_subprogram (
utl_call_stack.subprogram(2)));
end logger;
procedure proc1 is begin logger; proc2; end;
procedure proc2 is begin logger; end;
end pack1;
/
Вызов и результат:
exec pack1.proc1
# unit:PACK1 iam PACK1.LOGGER called from PACK1.PROC1
# unit:PACK1 iam PACK1.LOGGER called from PACK1.PROC2