web-dev-qa-db-fra.com

Oracle PL/SQL - Conseils pour une impression immédiate de la sortie/de la console

J'ai un certain nombre de procédures pl/sql qui peuvent prendre plusieurs minutes à s'exécuter. Lors de leur développement, j'ai ajouté quelques instructions imprimées pour faciliter le débogage, ainsi que des informations en retour et des indicateurs de progression. Au départ, je les utilisais sur de petits ensembles d’essais et la sortie était presque instantanée. Maintenant que je teste avec des ensembles de test plus volumineux qui prennent plusieurs minutes, je constate que l’impression sur la console n’est plus adaptée, car rien n’est imprimé avant la fin de la procédure. Je suis habitué à travailler dans des environnements qui ne tamponnent pas leur sortie et ne l'impriment pas immédiatement. Il est courant d'ajouter des instructions d'impression simples pour le débogage et le diagnostic simples.

Est-il possible dans pl/sql d’imprimer la sortie immédiatement (non tamponnée)? Sinon, quelles alternatives les gens recommandent-ils pour obtenir un résultat similaire?

Vous pouvez avoir une procédure qui écrit des messages dans une table en utilisant une transaction autonome du type:

procedure log (p_message)
is
    pragma autonomous_transaction;
begin
    insert into message_log (user, datetime, message)
    values (user, sysdate, p_message);
    commit;
end;

Puis surveillez la table à partir d'une autre session Oracle.

18
Tony Andrews

nous avons un petit truc pour ça.

vous pouvez utiliser DBMS_APPLICATION_INFO.set_client_info ("certaines informations ici"); créer des variables et remplacer la chaîne entre "".

et utilisez select client_info de v $ session pour surveiller la progression.

9
Henry Gao

J'utilise dbms_pipe à cette fin. Envoyez des messages à un canal nommé et lisez-les à partir d'une autre session. Cette méthode peut ne pas fonctionner dans un environnement RAC lorsque les processus d'écriture et de lecture peuvent se connecter à un nœud différent.

Vous pouvez également insérer des messages dans une table à l'aide d'une procédure exécutée dans sa propre session à l'aide de "pragma autonome_transaction". Vous pouvez interroger ces messages depuis une autre session

Edit: Je vois que ma deuxième option a déjà été mentionnée.

2
Rene

Une alternative consiste à utiliser une fonction en pipeline qui renvoie vos informations de journalisation. Voir ici pour un exemple: http://berxblog.blogspot.com/2009/01/pipelined-function-vs-dbmsoutput.html Lorsque vous utilisez une fonction en pipeline, vous n'êtes pas obligé d'utiliser un autre SQLPLUS/Toad/sql developer etc ... session.

1
tuinstoel

Il y a généralement deux options:

  • Envoyer la sortie vers une table Oracle (Ou une table temporaire)
  • Ecrire dans le système de fichiers (hôte de base de données) avec UTL_FILE

Si vous n'avez pas accès au système d'exploitation de l'hôte de la base de données, vous pouvez toujours écrire sur le système de fichiers dbhost et lier une table définie de manière externe au fichier afin qu'elle puisse être interrogée à l'aide de SELECT.

1
dpbradley

Cela peut dépendre de votre outil client. Je n'ai pas utilisé SQL * Plus depuis un moment, mais lorsque je suis en train de déboguer des procédures dans PL/SQL Developer, j'ouvre une fenêtre de commande et lance une commande SET SERVEROUTPUT ON. Ensuite, lorsque j'exécute la procédure, tout ce qui est imprimé avec DBMS_OUTPUT.PUT_LINE apparaît immédiatement.

Edit: vous avez raison, je suppose que je ne voyais que cela avec une plus grande quantité de sortie ou quelque chose comme ça. Quoi qu'il en soit, j'ai fait quelques recherches en ligne et suis tombé sur ce log4plsql - peut être utile.

1
Dan

Vous pouvez utiliser DBMS Pipe et Pipe Viewer dans PL/SQL Developer pour capturer de manière asynchrone toutes les informations au fur et à mesure de leur insertion dans le canal.

Veillez à ne mettre des choses dans un tuyau que si quelqu'un le lit. Sinon, votre appel échouera lorsque le canal est plein.

Il existe également la possibilité d'utiliser des événements, PL/SQL Developer dispose également d'un moniteur d'événements. Et la documentation devrait donner un exemple de la façon de le faire.

1
Robert Giesecke

Une autre option consiste à demander à votre PL/SQL d’appeler une procédure pour envoyer un courrier électronique contenant le message du journal. Cela nécessite que votre base de données dispose d'une fonction d'envoi de courrier électronique, qui peut être ajoutée à l'aide de UTL_SMTP.

0
Leigh Riffel