5 votes

oracle plsql : récupération des valeurs des paramètres d'exécution lorsque vous appelez une procédure

J'ai besoin d'une méthode généralisée pour obtenir la liste des paramètres d'exécution (valeurs) lorsque j'appelle une procédure. J'ai besoin de quelque chose de similaire à la $$PLSQL_UNIT qui renvoie le nom de la procédure en cours d'exécution. (plsql Oracle 10g)

Par exemple, regardez cet exemple de procédure : (elle imprime simplement son propre nom et ses paramètres)

CREATE OR REPLACE PROCEDURE  MY_PROC(ow in varchar2, tn IN varchar2)
 IS

BEGIN
     dbms_output.put_line('proc_name: '||$$PLSQL_UNIT||' parameters: '|| ow||' '||tn  );

    EXCEPTION
    WHEN OTHERS THEN 
       DBMS_OUTPUT.PUT_LINE('ERRORE: ' ||SQLERRM);

END MY_PROC;
/

L'exécution de la procédure produit le résultat suivant :

SQL> 
  1   BEGIN
  2     IBAD_OWN.MY_PROC('first_par', 'second_par');
  3   END;
  4  /

proc_name: MY_PROC parameters: first_par second_par

PL/SQL procedure successfully completed.

Je ne suis pas satisfait parce que je ne peux pas copier et coller toutes mes procédures car je dois coder en dur chaque procédure pour définir les variables de paramètres appropriées.

Merci d'avance pour votre aide.

2voto

Allan Points 7800

Il n'est pas possible de récupérer dynamiquement les valeurs des paramètres passés à une procédure dans Oracle PL/SQL. Le langage n'est tout simplement pas conçu pour gérer ce type d'opération.

Par ailleurs, dans une procédure qui se trouve dans un paquet, $$PLSQL_UNIT ne renverra que le nom du paquet. Je trouve qu'il est préférable de définir une constante au nom cohérent dans chaque procédure qui contient le nom de la procédure.

1voto

schizo Points 11

Lorsque j'ai voulu avoir la même fonctionnalité que la vôtre, je n'ai pas trouvé de bonne solution intégrée.

Ce que j'ai fait est : j'ai écrit un trigger au niveau de la base de données qui modifie le corps original de la fonction/procédure/package. Ce déclencheur ajoute immédiatement après "begin" un morceau de code généré dynamiquement à partir de "user_arguments".

De plus, après cela, j'inclus dans ce déclencheur le code qui enregistre les appels de procs lorsque l'exception se produit.

De plus, vous pouvez tracer les appels de procs, et beaucoup d'autres choses intéressantes.

Mais cette solution ne fonctionne bien que pour la préproduction car les performances diminuent considérablement.

PS. Désolé pour mon mauvais anglais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X