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 :

Gestion des excceptions


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut Gestion des excceptions
    Bonjour,

    Je voudrais dans un de mes programmes pouvoir créer des dossiers clients
    même si des valeurs attendues sont erronnées et stockées dans une table intermédiaire toutes ces valeurs et dans le même temps je souhaiterais pouvoir annuler la création du dossier client si il manque pour ce client une donnée obligatoire...

    En bref je voudrais balayer tout mes dossiers clients , tracer les erreurs annuler et rejeter le dossier si incomplet ....

    Est ce quelqu'un peut m'aider...

    Je pensais pouvoir résoudre le problème avec une transaction autonome mais
    lorsque je trace les erreurs dans ma table de log je suis obligé de faire un rollback avant d'utiliser ma transaction autonome ... du coup je perd la création de mon dossier alors qu'il n'y a peut être que des valeurs erronées pour ce dossier ...

    Merci pour tout aide

    Delphine

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Je ne vois pas trop le rapport avec le fait d'utiliser une transaction autonome.

    Si tu places toutes tes données dans une table de transit, qu'est-ce qui t'empeche de faire des requêtes de vérification ligne aprés ligne ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    En fait quand je crée mon dossier client je lui attribue différentes commandes et différents autres evenements... Ces données sont stockées dans des tables réelles ... Si les informations sont incomplètes alors le dossier client est rejeté entièrement (rollback des enregistrements dans les tables reelles) mais durant la création de ce dossier client toutes les données erronées ont été historisées afin de permettre de garder une trace des corrections à apporter à ce dossier en plus de la correction portant sur le rejet du dossier. Et ces données là si je fais un rollback global il me fait un rollback de la création du dossier mais aussi des données erronées historisées...En gros je dois "commiter" l'historique des données erronnées et "rollbacker" la création du dossier.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    J'essayes de décomposer le problème pour etre plus claire ...

    J'ai pour un Dossier client 3 evenements à créer.

    Le premier evenement est traité : il manque quelques infos mais rien de bloquants.
    -- J'insere l'èvenement traité dans ma table d'evenement client (commande par exemple)
    -- donc j'insere les données manquantes mais non bloquantes dans ma table des anomalies et je continue mon traitement.
    Le deuxième evenement est créé : il manque quelques infos mais rien de bloquants la aussi.
    -- J'insere l'èvenement traité dans ma table d'evenement client (refus commande par exemple)
    -- donc j'insere les données manquantes mais non bloquantes dans ma table des anomalies et je continue mon traitement.
    Le troisième evenement est créé : il manque des informations bloquantes.
    -- Je rejette donc intégralement le dossier.. Rollback de tout mes évènements
    -- Par contre je commit ma table des anomalies

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Je ne suis pas trop sûr d'avoir tout compris, mais :
    - l'insertion de tous tes évènements doit se faire dans la même transaction
    - l'insertion de tes anomalies doit se faire dans une autre transaction.
    => via une procédure autonome.

    Le problème c'est qu'ainsi tu es obligée de committer à chaque anomalie insérée.

    exemple :
    - creation de la procedure autonome
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace procedure trace_anomalie is
    pragma autonomous_transaction;
    begin
    insert into anomalie ...
    commit;
    end;
    /
    - gestion de l'insertion des évènements :
    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
    -- controle si tout est correctement renseigne pour le 1e evt
    ....
    if warning then 
      trace_anomalie;
    end if;
    if ok then
       insert into table 1...
    end if;
    -- controle si tout est correctement renseigne pour le 2e evt
    ....
    if warning then 
      trace_anomalie;
    end if;
    if ok then
       insert into table2...
    else 
      rollback;
    end if;
    -- controle si tout est correctement renseigne pour le 3e evt
    ....
    if warning then 
      trace_anomalie;
    end if;
    if ok then
       insert into table3...
    else 
      rollback;
    end if;
    Ainsi tes anomalies resteront, alors que les évènements seront rollbackés.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    oui mais il me semble qu'avant de passer dans ma transaction autonome je suis obliger de faire un rollback ?? Donc du coup je perd l'insertion possible du dossier en cours ?

  7. #7
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Non, puisque la transaction est autonome : c'est comme si tu avais 2 SQL*Plus d'ouvert que tu faisais des maj dans l'un, des insertion dans l'autre et que tu rollback tes maj; les insertions faites dans le 2è SQL*Plus ne seront pas rollbackées.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    Ok je reverifie mon programme tout de suite... j'ai du laisser passer un loup.

    Je te remercie pour ton aide ...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    En fait en passant par une procedure autonome ... je me retrouve
    avec le probleme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ORA-02055 : Echec d'operation de mise à jour distribuée, annulation requise
    ORA-00164 : Transaction autonome non autorisée dans une transaction 
    distribuée.
    Ce probleme intervient lorsque je verifie l'existence d'une valeur dans une table provenant d'une autre base.
    donc quand il ne trouve pas de valeur j'essaie de la tracer dans ma table d'anomalie et là ca plante

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    Est-ce que quelqu'un aurait une piste pour résoudre ce problème ?

  11. #11
    Expert éminent sénior
    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
    Points : 19 075
    Points
    19 075
    Par défaut
    tu n'as pas le droit au DBLink dans une transaction autonome.

  12. #12
    Expert éminent sénior
    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
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par delphine_lep
    J'essayes de décomposer le problème pour etre plus claire ...

    J'ai pour un Dossier client 3 evenements à créer.

    Le premier evenement est traité : il manque quelques infos mais rien de bloquants.
    -- J'insere l'èvenement traité dans ma table d'evenement client (commande par exemple)
    -- donc j'insere les données manquantes mais non bloquantes dans ma table des anomalies et je continue mon traitement.
    Le deuxième evenement est créé : il manque quelques infos mais rien de bloquants la aussi.
    -- J'insere l'èvenement traité dans ma table d'evenement client (refus commande par exemple)
    -- donc j'insere les données manquantes mais non bloquantes dans ma table des anomalies et je continue mon traitement.
    Le troisième evenement est créé : il manque des informations bloquantes.
    -- Je rejette donc intégralement le dossier.. Rollback de tout mes évènements
    -- Par contre je commit ma table des anomalies

    et c'est pas possible d'insérer dans anomalie sans utiliser d'autonomous transaction ?

  13. #13
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    ben je suppose que non si on veut garder les anomalies et rollbacker totalement l'insertion des 3 événements...

    à moins de faire un tableau de tableAnomalies%RowType ...
    du coup, quand il y a anomalie 1 => au lieu de faire effectivement l'insert dans la table anomalie, on crée la ligne dans le tableau, idem pour les anomalies 2 et 3 et ...
    puis lorsqu'on tombe sur une erreur bloquante, on rollbak les insert dans les tables d'événements PUIS on insère dans la table d'anomalies le contenu du tableau et on commite CET insert !

  14. #14
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Il serait bien de donner tous les éléments au départ et surtout la version d'oracle utilisée (cf. règles du forum).

    En effet, il est impossible d'utiliser une procédure autonome quand on utilise un DBLink en 8i. Avec les versions supérieures d'oracle cela semble fonctionner :
    http://asktom.oracle.com/pls/ask/f?p...12971871501762

    La solution de Yorglaa me semble tout à fait répondre à ton problème.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    Dans ma procédure autonome il n'y a aucun dblink ... je fais une insertion
    dans une table locale ...

    Le truc c'est que juste avant je testes qu'une requete qui fait appelle
    à des tables d'une autre base me renvoie une valeur.
    Et si cette requete ne me renvoie rien alors je fais appelle à ma procédure autonome (qui écrit dans une table locale )....

  16. #16
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    En quelle version d'oracle es-tu ? Cela devient lassant de devoir le demander...

  17. #17
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    excuses moi

    Oracle 9i

    PL/SQL Release 9.0.1.3.0 - Production .

  18. #18
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Bizarre, en tout cas à partir de la 9.02, cela fonctionne :
    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
    SQL> show release
    release 902000400
     
    SQL> CREATE OR REPLACE procedure traces (msg in varchar2) is
      2  pragma autonomous_transaction;
      3  begin
      4     insert into debug (dbg_text) values (substr (msg, 1, 1000));
      5     commit;
      6   end;
      7  /
    Procedure created.
     
    SQL> declare
      2     res varchar2(1);
      3  begin
      4     traces ('Debut lecture');
      5     select '1' into res from dual@db_9;
      6     traces ('Fin lecture');
      7  end;
      8  /
    PL/SQL procedure successfully completed.
    Essaie cet exemple, s'il ne fonctionne pas, tu vas devoir te rabattre sur la solution proposée par Yorglaa.

  19. #19
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 92
    Points : 30
    Points
    30
    Par défaut
    et non ce ne marche pas mieux j'ai toujours le message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-00164: transaction autonome non autorisée dans une transaction distribuée

  20. #20
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    est-ce que par hasard, le paramètre COMPATIBLE de ta base ne serait pas positionné à 8xxx
    ce qui expliquerait que certaine restrictions de la 8i soient toujours valides avec ta version 9i

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. gestion des groupes
    Par muaddib dans le forum QuickReport
    Réponses: 3
    Dernier message: 31/12/2002, 12h01
  2. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 10h40
  3. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 13h44
  4. Réponses: 4
    Dernier message: 04/07/2002, 13h31
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 15h11

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