Question

J'ai un certain nombre de procédures pl / sql qui peut prendre plusieurs minutes pour exécuter. Tout en les développant, j'ai ajouté quelques instructions d'impression pour aider debug et également fournir des commentaires et indicateurs de progrès. Dans un premier temps, je courais sur ces ensembles de test petites et la production a été presque instantanée. Maintenant que je teste avec des jeux de tests plus importants qui prennent plusieurs minutes pour courir, je trouve que l'impression à la console n'est plus approprié, parce que rien n'est imprimé jusqu'à la fin de la procédure. Je suis habitué à travailler dans des environnements qui ne tamponnent pas leur sortie et l'imprimer immédiatement et en ajoutant impression-instructions simples pour le débogage simple et de diagnostic est commun.

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

Était-ce utile?

La solution

Vous pouvez avoir une procédure qui écrit des messages à une table à l'aide d'un quelque chose de transaction autonome comme:

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

Gardez ensuite la table d'une autre session Oracle.

Autres conseils

nous avons un petit truc pour cela.

vous pouvez utiliser DBMS_APPLICATION_INFO.set_client_info ( "quelques informations ici"); la création de certaines variables et remplacer la chaîne à l'intérieur « ».

et utiliser select client_info de v $ session pour suivre les progrès.

Je me sers DBMS_PIPE à cet effet. Envoyer des messages à un tube nommé et les lire d'une autre session. Cette méthode ne fonctionne pas dans un environnement RAC lorsque les processus d'écriture et de lecture peuvent se connecter à un autre nœud.

Vous pouvez aussi insérer des messages dans une table à l'aide d'une procédure qui fonctionne dans sa propre session en utilisant « pragma autonomous_transaction ». Vous pouvez la requête de ces messages d'une autre session

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

.

Il y a généralement deux options:

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

Si vous ne disposez pas du système d'exploitation à l'hôte de base de données, vous pouvez toujours écrire sur le système de fichiers dbhost et lier une table Oracle externe défini dans le fichier afin qu'il puisse être interrogé avec SELECT.

Il peut dépendre de votre outil client. Je ne l'ai pas utilisé SQL * Plus dans un certain temps, mais quand je suis dans le débogage des procédures PL / SQL, j'ouvrir une fenêtre de commande et une commande de SET SERVEROUTPUT ON. Puis, quand j'exécute la procédure, quoi que ce soit imprimé par DBMS_OUTPUT.PUT_LINE montre tout de suite.

Edit: vous avez raison, je suppose que je voyais seulement avec des quantités plus importantes de la production ou de quelque chose. Quoi qu'il en soit, je l'ai fait quelques recherches en ligne et suis tombé sur cette log4plsql -. Peut être utile

Une alternative est d'utiliser une fonction qui retourne votre pipe-line des informations de connexion. Voir ici pour un exemple: http: //berxblog.blogspot. com / 2009/01 / fonction-pipe-line vs-dbmsoutput.html Lorsque vous utilisez une fonction que vous n'avez pipelinée de ne pas utiliser un autre SQLPLUS / Toad / développeur sql etc ... session.

Vous pouvez utiliser SGBD Pipe et la visionneuse de tuyaux en PL / SQL Developer pour attraper tous les infos de manière asynchrone car ils sont mis dans le tuyau.

Veillez à ne mettre les choses dans un tuyau quand il y a quelqu'un de le lire. Dans le cas contraire, votre appel échouera lorsque la conduite est pleine.

Il y a aussi la possibilité d'utiliser des événements, PL / SQL Developer est un moniteur d'événements aussi bien. Et les documents doivent donner un exemple de la façon de le faire.

Une autre option est d'avoir votre appel PL / SQL d'une procédure d'envoyer un e-mail avec le message du journal en elle. Cela exige que la base de données a la capacité d'envoyer e-mail, ce qui peut être ajouté à l'aide UTL_SMTP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top