IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

PL/SQL: Logger une requête SQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 4
    Par défaut PL/SQL: Logger une requête SQL
    Bonjour,

    Je suis actuellement en train de mettre en place une gestion de trace au sein de package PL/SQL.
    J'ai déjà mis une procédure me permettant de logger dans un fichier externe des traces formattées pour aider à la qualification de problèmes client.

    Bon maintenant la seconde étape pour pouvoir des qualifications complètes serait de pouvoir tracer le contenu de requêtes SQL dans un fichier.

    En gros je voudrais un equivalent la procédure suivante mais pour une requête SQL comme un SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
      procedure writeLog ( message in string) is
        file UTL_FILE.FILE_TYPE;
      begin
        /*To write Logs in a file*/
        /*But you have to complete following command to have something:
              CREATE DIRECTORY SCLOG AS 'D:\tmpOra\';
              GRANT READ,WRITE ON DIRECTORY SCLOG TO USER;
        */
        begin
         IF not UTL_FILE.IS_OPEN(file) THEN
            file:= UTL_FILE.FOPEN('SCLOG','fichier.log','a');
         end if;
         IF UTL_FILE.IS_OPEN(file) THEN
           UTL_FILE.PUT(file,TO_CHAR(SYSDATE, '[DD/MM/YYYY HH24:MI:SS]')||' DEBUG'||': ');
           UTL_FILE.PUT_LINE(file,message);
           UTL_FILE.FFLUSH(file);
           utl_file.fclose(file);
         end if;
        exception
         when others then
           IF UTL_FILE.IS_OPEN(file) THEN
              UTL_FILE.PUT(file,TO_CHAR(SYSDATE, '[DD/MM/YYYY HH24:MI:SS]')||' ERROR'||': ');
              UTL_FILE.PUT_LINE(file,'ERROR ==> Problem to write into log file '|| dbms_utility.format_error_stack);
              UTL_FILE.FFLUSH(file);
              utl_file.fclose(file);
           end if;
        end;  
      end;
    D'avance merci pour votre aide.

    Cdt,
    Razmoket

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    tu ne peux pas, en fait faut mettre des "tags" pour savoir où chercher dans le code mais tu peux pas faire mieux...

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Razmoket Voir le message
    Bonjour,

    Je suis actuellement en train de mettre en place une gestion de trace au sein de package PL/SQL.
    J'ai déjà mis une procédure me permettant de logger dans un fichier externe des traces formattées pour aider à la qualification de problèmes client.
    Cherchez aussi log4SQL dans Google !

    Bon maintenant la seconde étape pour pouvoir des qualifications complètes serait de pouvoir tracer le contenu de requêtes SQL dans un fichier.

    En gros je voudrais un equivalent la procédure suivante mais pour une requête SQL comme un SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
      procedure writeLog ( message in string) is
        file UTL_FILE.FILE_TYPE;
      begin
        /*To write Logs in a file*/
        /*But you have to complete following command to have something:
              CREATE DIRECTORY SCLOG AS 'D:\tmpOra\';
              GRANT READ,WRITE ON DIRECTORY SCLOG TO USER;
        */
        begin
         IF not UTL_FILE.IS_OPEN(file) THEN
            file:= UTL_FILE.FOPEN('SCLOG','fichier.log','a');
         end if;
         IF UTL_FILE.IS_OPEN(file) THEN
           UTL_FILE.PUT(file,TO_CHAR(SYSDATE, '[DD/MM/YYYY HH24:MI:SS]')||' DEBUG'||': ');
           UTL_FILE.PUT_LINE(file,message);
           UTL_FILE.FFLUSH(file);
           utl_file.fclose(file);
         end if;
        exception
         when others then
           IF UTL_FILE.IS_OPEN(file) THEN
              UTL_FILE.PUT(file,TO_CHAR(SYSDATE, '[DD/MM/YYYY HH24:MI:SS]')||' ERROR'||': ');
              UTL_FILE.PUT_LINE(file,'ERROR ==> Problem to write into log file '|| dbms_utility.format_error_stack);
              UTL_FILE.FFLUSH(file);
              utl_file.fclose(file);
           end if;
        end;  
      end;
    ...
    Que est-ce que tu veux tracer exactement, la requête qui s’exécute ?

    Petit remarque : Cette procédure contient le bug numéro 1 du code PL/SQL : WHEN OTHERS THEN NULL (dans certains cas c’est vrai)

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Petit remarque : Cette procédure contient le bug numéro 1 du code PL/SQL : WHEN OTHERS THEN NULL (dans certains cas c’est vrai)


    Ha non... on va pas refaire le débat hein

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par orafrance Voir le message


    Ha non... on va pas refaire le débat hein
    Salut Orafrance et bonne année

    Pas du tout ! J’attends de toi que tu m’explique toute simplement dans ce cas, pourquoi quand le fichier n’est pas ouverte on devrait ignorer les erreurs

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Merci bonne année à toi aussi

    Une raison pourrait être que le logging est un plug-in qui n'a pas d'impact fonctionnel et donc ne doit pas bloquer l'utilisateur ou mettre l'application en erreur et donc tu peux décider que si le logging est HS tu ignores le dysfonctionnement.
    Ce serait quand même balaud de planter l'enregistrement d'une facture de 100 lignes parce que le lecteur contenant les logs est déconnecté

    Néanmoins, sys.dbms_system.ksdwrt est plus élégant pour écrire une alerte dans le fichier ad hoc mais cela nécessite des droits étendus j'imagine

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par orafrance Voir le message
    ...
    Une raison pourrait être que le logging est un plug-in qui n'a pas d'impact fonctionnel et donc ne doit pas bloquer l'utilisateur ou mettre l'application en erreur et donc tu peux décider que si le logging est HS tu ignores le dysfonctionnement.
    Ce serait quand même balaud de planter l'enregistrement d'une facture de 100 lignes parce que le lecteur contenant les logs est déconnecté
    ...
    Sauf que ça va pas (crois moi c’est toujours le bug numéro 1).
    Analyse le code dans la situation suivante : le fichier est ouvert mais l’instruction UTL_FILE.FFLUSH échoue. Cella provoque une exception et donc on passe dans le block WHEN Others. Le fichier est ouvert donc on va réessayer de exécuter UTL_FILE.FFLUSH qui va échouer une nouvelle fois, ce qui va provoquer une nouvelle exception non interceptée et qui va planter bien sûr la saisie de la facture de 100 lignes. Donc exactement le contraire de ce qu’on a essayé d’éviter .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/11/2008, 12h04
  2. Stocker une requête SQL dans une table
    Par dmk04 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 05/02/2007, 15h24
  3. Comment stocker une requête sql dans une variable ?
    Par innova dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/10/2006, 10h01
  4. [SQL] Simplifier une requête SQL ?
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/04/2006, 13h50
  5. Utilisation d'une fonction Transact-SQL ds une requête SQL
    Par Fl0ppeur dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo