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

SQL Oracle Discussion :

MERGE - Pousuivre malgré une erreure


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut MERGE - Pousuivre malgré une erreure
    Bonjour à tous,

    J'ai actuellement un stored proc qui fonctionne (chargement de donnée dans une 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    create or replace
    procedure imp_cap_brand as
    begin
     
    declare
    error_var integer;
    my_select VARCHAR2(4000);
      begin
          DBMS_ERRLOG.CREATE_ERROR_LOG('BRD', 'ERRLOG'); --création de la table de log d'erreur
     
          MERGE INTO BRD  --debut du merge
          USING WK_CAP_MANUFACTURERS WK_BRD
          ON (WK_BRD.MANUFACTURER_CODE=BRD.BRD_ID)
          WHEN MATCHED THEN 
                      UPDATE SET BRD.BRD_NM = WK_BRD.MANUFACTURER_NAME, 
                                 BRD.BRD_ABBR = WK_BRD.MANUFACTURER_CAP_CODE_LOOKUP,
                                 BRD.BRD_TYP_CD = '001'
          WHEN NOT MATCHED THEN 
                      INSERT (BRD.BRD_ID,BRD.BRD_NM,BRD.BRD_ABBR,BRD.BRD_TYP_CD) 
                      VALUES (WK_BRD.MANUFACTURER_CODE ,WK_BRD.MANUFACTURER_NAME ,WK_BRD.MANUFACTURER_CAP_CODE_LOOKUP, '001')
                      LOG ERRORS INTO errlog ('BRD_MERGE_INSERT');
     
          -- on teste si on a rencontré une erreure durant le merge
          my_select := 'SELECT count(ORA_ERR_NUMBER$) FROM errlog';
          execute immediate(my_select) into error_var;
          DBMS_OUTPUT.PUT_LINE(error_var);
     
          If error_var = 0 
          Then 
            DBMS_OUTPUT.PUT_LINE('Aucune erreure');
          else
            DBMS_OUTPUT.PUT_LINE('Erreure trouvée'); 
          End if;            
     
          my_select := 'DROP TABLE ERRLOG';
          execute immediate(my_select);
     
          --gestion des erreures c'est là que j aimerai retourné dans le merge
          exception 
          when others then 
                DBMS_OUTPUT.PUT_LINE('Erreure remontée');
                --rollback;  -- rollback la transaction
                --raise; 
      end;
    end imp_cap_brand;
    Mon souci c'est que à la premiére erreure du merge, Oracle sort de la procédure. Moi j'aimerai parcourir tous le senregistrements et poursuivre malgré une erreure. Pensez vous que c'est possible avec MERGE ?

  2. #2
    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
    à moins de traiter ligne à ligne avec un curseur ce n'est pas possible... et dans ce cas tu risques de dégrader les perfs

    le mieux c'est encore d'éviter les erreurs

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bon au final j'ai réussit à faire un truc qui marche. Mon erreure était de créer le fichier de log dans la stored proc en fait je la crée une fois au début et par la suite la vide puis la remplit avec les erreurs:

    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
    32
    33
    34
    35
    create or replace
    procedure imp_cap_brand as
    begin
    declare
    error_var integer;
    my_select VARCHAR2(4000);
      begin
          my_select := 'TRUNCATE TABLE errlog';
          execute immediate(my_select);
          
          MERGE INTO BRD
          USING WK_CAP_MANUFACTURERS WK_BRD
          ON (WK_BRD.MANUFACTURER_CODE=BRD.BRD_ID)
          WHEN MATCHED THEN 
                      UPDATE SET BRD.BRD_NM = WK_BRD.MANUFACTURER_NAME, 
                                 BRD.BRD_ABBR = WK_BRD.MANUFACTURER_CAP_CODE_LOOKUP,
                                 BRD.BRD_TYP_CD = '001'
          WHEN NOT MATCHED THEN 
                      INSERT (BRD.BRD_ID,BRD.BRD_NM,BRD.BRD_ABBR,BRD.BRD_TYP_CD) 
                      VALUES (WK_BRD.MANUFACTURER_CODE ,WK_BRD.MANUFACTURER_NAME ,WK_BRD.MANUFACTURER_CAP_CODE_LOOKUP, '001')
                      LOG ERRORS INTO errlog ('BRD_MERGE_INSERT') REJECT LIMIT UNLIMITED;
     
          -- on teste si on a rencontré une erreure durant le merge
          my_select := 'SELECT count(ORA_ERR_NUMBER$) FROM errlog';
          execute immediate(my_select) INTO error_var;
          DBMS_OUTPUT.PUT_LINE(error_var);
          
          IF error_var = 0 
          Then 
            DBMS_OUTPUT.PUT_LINE('Aucune erreure');
          else
            DBMS_OUTPUT.PUT_LINE('Erreure trouvée'); 
          end IF;            
      end;
    end imp_cap_brand;
    Le paramétre REJECT LIMIT UNLIMITED sur les update, insert ou merge permet de poursuivre malgré une erreure.

    Dans ma table de log j'aurais en cas d'erreure les valeures suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * from errlog where rownum < 3
    ORA_ERR_NUMBER$        ORA_ERR_MESG$ 
    ---------------------- -----------------------------------------------------------------------------------------
    2291                   ORA-02291: integrity constraint (VCACORE.FK_BRD_BRD_TYP) violated - parent key not found 
    2291                   ORA-02291: integrity constraint (VCACORE.FK_BRD_BRD_TYP) violated - parent key not found 
    2 rows selected

  4. #4
    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
    ha pas mal, je ne connaissait pas

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

Discussions similaires

  1. Insérer malgré une erreur Trigger
    Par mlaunay dans le forum PL/SQL
    Réponses: 8
    Dernier message: 04/12/2014, 14h29
  2. [PDO] transaction validée malgrès une erreur
    Par Alexdezark dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/09/2010, 10h09
  3. Continuer un job malgré une erreur
    Par jeanphi45 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 17/06/2010, 15h04
  4. Réponses: 7
    Dernier message: 20/12/2009, 18h42
  5. Réponses: 5
    Dernier message: 11/09/2007, 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