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

Oracle Discussion :

Trace des erreurs Oracle 8i


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut Trace des erreurs Oracle 8i
    Bonjour à vous,

    Je développe pas mal de scripts PL/SQL (sous oracle 8i) en ce moment pour la création d'un infocentre, et je voudrais pouvoir tracer les erreurs Oracle, sans interrompre la séquence de scripts, et indépendament de la configuration du serveur...

    L'idée de base consistait à capturer les exceptions, et les stocker dans une table... mais je m'en sort pas...

    Vous avez une solution 'simple'?

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Bonjour,
    Tu peux te servir de sqlerrm ,

    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> set serveroutput on 
    SQL> Begin 
      2  execute immediate 'insert into table_qui_existe_pas values (1)' ; 
      3  EXCEPTION 
      4    WHEN OTHERS THEN
      5    dbms_output.put_line('erreur suivante encontré :'||sqlerrm );
      6    end ; 
      7  /
    erreur suivante encontré :ORA-00942: table or view does not exist
     
    Procédure PL/SQL terminée avec succès.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073

  4. #4
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    C'est bel et bien ce que j'avais commencé à faire...

    Seul problème, c'est que j'ai des create, drop... qui ne sont pas acceptés dans un block declare-begin-end...

    Faut passer par des execute immediate systématiquement??

    Edit : j'ai répondu avant de voir les liens

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Oui
    Avec un Drop :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL> set serveroutput on 
    SQL> Begin 
      2  execute immediate 'drop table  table_qui_existe_pas ' ; 
      3  EXCEPTION 
      4    WHEN OTHERS THEN
      5    dbms_output.put_line('erreur suivante encontré :'||sqlerrm );
      6    end ; 
      7  /
    erreur suivante encontré :ORA-00942: table or view does not exist
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>

  6. #6
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Merci...

    Je continue mon bazard... J'ai réparti mes scripts dans différents fichiers (vu le volume, c'est vital).

    test.sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    declare
    begin
         execute immediate 'drop table toto' ;
    end ;
    /
    gestion des erreurs (future fonction, avec le nom du fichier .sql en paramètre)
    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
     
    SET serveroutput ON
    declare
    chaine varchar2(100) ;
    begin
     
         @test.sql
     
    exception
             when others then
                 dbms_output.put_line( 'erreur: '||SQLCODE) ;
                 chaine := SQLCODE||': '||SQLERRM ;
                  insert into error (date_erreur,fichier,message)
                         values (
                                sysdate,
                                'toto.sql' ,
                                chaine)
                  ;
     
    end ;
    /
    select * from error ;
    Le problème est que le lancement de test.sql me donne une erreur de type :
    ERREUR à la ligne 1 :
    ORA-00942: Table ou vue inexistante
    ORA-06512: à ligne 3
    Et l'execution du script général donne :
    -950: ORA-00950: Option de suppression non valide



    Passer par un @test.sql posserait t'il problème dans la transmission des erreurs...?

  7. #7
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Créé la table toto pour que la compilation marche.

    Tant qu'à dropper/recreer la table, pourquoi ne pas faire un truncate plutot ?

  8. #8
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    je cherche à recuperer les erreurs, ce drop là est un exemple...

  9. #9
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Oui, pardon

  10. #10
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    J'ai trouvé !!!

    Dans le fichier test.sql, il ne fallait pas mettre le / final!!

    Merci pour tout (en esperant que je ne vous embette plus... )

  11. #11
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    ah, il y a un exemple complet aussi chez asktom :

    http://asktom.oracle.com/pls/ask/f?p...D:433029981484

  12. #12
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Désolé, j'ai toujours pas fini...

    Voila, j'arrive à cette procédure :

    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
    create or replace procedure appel_fichier(fich in varchar2) is
    chaine varchar2(100) ;
    begin
     
         chaine := '@'||'&fich'||';' ;
         dbms_output.put_line(chaine) ;
         execute immediate chaine ;
         --@test.sql
     
     
    exception
             when others then
                 chaine := SQLCODE||': '||SQLERRM ;
                 dbms_output.put_line( 'erreur: '||chaine) ;
                  insert into error (date_erreur,fichier,message)
                         values (
                                sysdate,
                                fich ,
                                chaine)
                  ;
     
    end appel_fichier ;
    /
    show error ;
    J'ai de gros soucis avec l'appel de @test.sql...

    Si je le met en dur (ligne commentée), lors de la création de la fonction, il insere le code, puis il l'execute lors de l'appel.

    Or, je veux que le nom du fichier varie en fonction du paramètre de la procédure!!!


    je suis dans une impasse là? Ou y a une solution magique... :

  13. #13
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    quand tu déclares ta procédure, le @test.sql, quelque soit la façon dont tu l'a déclaré, ne peut pas marcher...

    @fichier est une commande sql*plus, mais elle n'est pas accessible en pl/sql à ma connaissance.

  14. #14
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Arg!

    Et il existe un moyen quelconque de contourner ce problème...?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    sous Unix tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sqlplus user/password@base <<EOF
    exec maprocedure;
    EOF

  16. #16
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    Suis sous windows...


    Je crois que je vais finir par

    @debut_gestion_erreurs ;
    @mon_script ;
    @fin_gestion_erreurs ;


    Bouh c'est pas bô!!!

  17. #17
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Ca dépend...

    Tu as quoi comme flux ? Des scripts sql ? Ou un mélange de scripts SQL et de procédures PL/SQL ?

    Si ce sont des scripts sql, tu peux toujours imbriquer leur appel dans un bloc pl/sql qui sera appelé sous sql*plus. Et pour les procédures, en utilisant la gestion classique de l'erreur, ça devrait le faire.

    En reprenant l'example de trouvé sur Asktom, tu peux faire une procédure de gestion des erreurs, et ainsi te simplifier la maintenance :

    Appel d'un script SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    test@BROCANTE> begin
    2  @test.sql
    6  exception when others then log_error; raise; end;
    7  /
     
    PL/SQL procedure successfully completed.
     
    test@BROCANTE> select * from error_table;
     
    TIMESTAMP WHENCE               MSG                                                      CODE
    --------- -------------------- -------------------------------------------------- ----------
    07-NOV-05  527756c        10   ORA-00942: Table ou vue inexistante                      -942
              anonymous block
    Et pour les procédures, tu rajoutes la même gestion des exceptions pour alimenter la même table...

    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
    30
    31
    test@BROCANTE> create or replace procedure appel_fichier(fich in varcha
    r2) is
    2  chaine varchar2(100) ;
    3  begin
    4  execute immediate 'drop table toto' ;
    5  exception when others then log_error; raise;
    6  end appel_fichier ;
    7  /
     
    Procedure created.
     
    test@BROCANTE> execute appel_fichier('');
    BEGIN appel_fichier(''); END;
     
    *
    ERROR at line 1:
    ORA-00942: table or view does not exist
    ORA-06512: at "TEST.APPEL_FICHIER", line 5
    ORA-06512: at line 1
     
     
    test@BROCANTE> select * from error_table;
     
    TIMESTAMP WHENCE               MSG                                                      CODE
    --------- -------------------- -------------------------------------------------- ----------
    07-NOV-05  527756c        10   ORA-00942: Table ou vue inexistante                      -942
              anonymous block
     
    08-NOV-05  5256b34         5   ORA-00942: table or view does not exist                  -942
              procedure TEST.APPEL
              _FICHIER
    On récupère en plus la procédure où se produit l'erreur

  18. #18
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 57
    Points : 47
    Points
    47
    Par défaut
    * reflexion intense *

    Ca semble jouable et pas trop laid en effet...

    Merci Doc!

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

Discussions similaires

  1. [Oracle] gestion des erreurs Oracle
    Par patk29 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/05/2008, 11h14
  2. Actualiser la table des erreur oracle
    Par arnaud036 dans le forum Administration
    Réponses: 15
    Dernier message: 18/11/2007, 16h33
  3. Réponses: 4
    Dernier message: 17/09/2007, 16h38
  4. liste des erreurs oracles
    Par Mathusalem dans le forum Oracle
    Réponses: 5
    Dernier message: 15/06/2006, 10h02

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