En 12c, le nom du sous-programme actuel est simplement :
utl_call_stack.subprogram(1)(2);
Le package actuel peut également être obtenu à partir de
utl_call_stack.subprogram(1)(1);
mais il est généralement plus facile d'utiliser simplement $$plsql_unit
. Vous pouvez également obtenir le nom qualifié (package.procedure
) comme :
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
Cependant , je ne vois aucune situation où une procédure ou une fonction (ou une méthode objet) voudrait son propre nom. Cette fonctionnalité est surtout utile dans une procédure de journalisation, auquel cas le 'qui m'a appelé ?' le code doit être dans l'enregistreur et non répété dans chaque chose qui l'appelle. Par conséquent, je suggérerais fortement d'éviter tout 'qui suis-je ?' logique dans les procédures. Au lieu de cela, mettez quelque chose comme ceci dans votre enregistreur (nécessite 12.1 ou version ultérieure) :
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;
Malheureusement, c'est un peu plus compliqué en 11g car il faut parser dbms_utility.format_call_stack
, et comme cela ne vous donne que le nom du package et le numéro de ligne (dans une chaîne de texte délimitée par un saut de ligne), vous devez alors interroger all_source
pour trouver le nom du sous-programme.
Je peux poster du code 11g si vous clarifiez à quoi il sert. Dans mon enregistreur 11g, j'ai trouvé utile de capturer dbms_utility.format_error_backtrace
ainsi que dbms_utility.format_call_stack
en fonction de sqlcode
etc. Il existe donc un ensemble de logiques spécifiques à la journalisation, dont vous n'aurez peut-être pas besoin si vous souhaitez simplement capturer le nom de la procédure actuelle pour une autre raison.