W 12c aktualna nazwa podprogramu to po prostu:
utl_call_stack.subprogram(1)(2);
Aktualny pakiet można również pobrać z
utl_call_stack.subprogram(1)(1);
ale generalnie łatwiej jest po prostu użyć $$plsql_unit
. Możesz również uzyskać kwalifikowaną nazwę (package.procedure
) jako:
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
Jednak , nie przychodzi mi do głowy żadna sytuacja, w której procedura lub funkcja (lub metoda obiektu) chciałaby mieć własną nazwę. Ta funkcja jest szczególnie przydatna w procedurze rejestrowania, w takim przypadku „kto do mnie dzwonił?” kod powinien znajdować się w rejestratorze, a nie powtarzać się w każdej rzeczy, która go wywołuje. Dlatego zdecydowanie sugerowałbym unikanie kim jestem? logika w procedurach. Zamiast tego umieść coś takiego w swoim rejestratorze (wymaga wersji 12.1 lub nowszej):
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;
Niestety w 11g jest to trochę bardziej skomplikowane, ponieważ musisz przeanalizować dbms_utility.format_call_stack
, a ponieważ daje to tylko nazwę pakietu i numer wiersza (w ciągu tekstowym oddzielonym wysuwem wiersza), musisz wykonać zapytanie all_source
aby znaleźć nazwę podprogramu.
Mogę opublikować kod 11g, jeśli wyjaśnisz, do czego to służy. W moim 11g loggerze uznałem za przydatne przechwytywanie dbms_utility.format_error_backtrace
jak również dbms_utility.format_call_stack
w zależności od sqlcode
itp., więc istnieje garść logiki, która jest specyficzna dla rejestrowania, której możesz nie potrzebować, jeśli chcesz przechwycić bieżącą nazwę procedury z jakiegoś innego powodu.