Oracle
 sql >> Base de données >  >> RDS >> Oracle

Nom de la procédure en cours d'exécution dans le package

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.