V 12c je aktuální název podprogramu pouze:
utl_call_stack.subprogram(1)(2);
Aktuální balíček lze také získat z
utl_call_stack.subprogram(1)(1);
ale obecně je jednodušší použít pouze $$plsql_unit
. Můžete také získat kvalifikovaný název (package.procedure
) jako:
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
Nicméně , nenapadá mě žádná situace, kdy by procedura nebo funkce (nebo metoda objektu) chtěla svůj vlastní název. Tato funkce je většinou užitečná v proceduře protokolování, v takovém případě se zobrazí 'kdo mi volal?' kód by měl být v loggeru a neměl by se opakovat v každé jednotlivé věci, která jej volá. Proto důrazně doporučuji vyhnout se jakémukoli kdo jsem? logika v postupech. Místo toho vložte do svého loggeru něco takového (vyžaduje 12.1 nebo novější):
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;
Bohužel je to v 11g trochu složitější, protože musíte analyzovat dbms_utility.format_call_stack
, a protože tím získáte pouze název balíčku a číslo řádku (v textovém řetězci odděleném odřádkováním), musíte se zeptat all_source
najít název podprogramu.
Mohu poslat nějaký 11g kód, pokud upřesníte, k čemu to je. V mém 11g loggeru jsem zjistil, že je užitečné zachytit dbms_utility.format_error_backtrace
a také dbms_utility.format_call_stack
v závislosti na sqlcode
atd., takže existuje spousta logiky, která je specifická pro protokolování, kterou možná nebudete potřebovat, pokud chcete pouze zachytit název aktuální procedury z nějakého jiného důvodu.