2013-07-21 2 views
0

Je suit la structure du codeSuivi échoué transaction insertion/mise à jour en vrac/supprimer

PROCEDURE .. 
    PRAGMA EXCEPTION_INIT(dml_errors, -24381); 
    l_errors   NUMBER; 

BEGIN 
    -- busines logic 
    FORALL TABLE_1 do delete; 
    FORALL TABLE_1 do update; 
    FORALL TABLE_1 do insert; 
    FORALL TABLE_2 do insert; 
    FORALL TABLE_2 do update; 
    FORALL TABLE_2 do insert; 
EXCEPTION 
    WHEN dml_errors then 
    --extract error indexes 
END; 

Chacune des offres de boucle forall avec une table séparée de la matrice-à-dire, la boucle qui supprime de table_1 traiterait une table de table_1_u index par pls_integer;

Chaque boucle a forall sauf exceptions keyword

Maintenant, comment puis-je extraire qui « pour » et a échoué « qui enregistrent dans cet indice a échoué ».

Répondre

3

comment puis-je extraire que "pour" échoué

Avec la pile d'appels (FORMAT_ERROR_BACKTRACE) ou en mettant en place une sorte d'étapes:

PROCEDURE .. 
    PRAGMA EXCEPTION_INIT(dml_errors, -24381); 
    l_errors   NUMBER; 
    iStep NUMBER; 
BEGIN 
    -- busines logic 
    iStep := 0; 
    FORALL TABLE_1 do delete; 
    iStep := 1; 
    FORALL TABLE_1 do update; 
    iStep := 2; 
    FORALL TABLE_1 do insert; 
    iStep := 3; 
    FORALL TABLE_2 do insert; 
    iStep := 4; 
    FORALL TABLE_2 do update; 
    iStep := 5; 
    FORALL TABLE_2 do insert; 
EXCEPTION 
    WHEN dml_errors then 
     IF iStep = 0 THEN 
     ELSIF... 
     END; 
END; 

qui dans ce dossier échec de l'index

En utilisant le curseur bulk_exceptions:

PROCEDURE .. 
    PRAGMA EXCEPTION_INIT(dml_errors, -24381); 
    l_errors   NUMBER; 
    iStep NUMBER; 
BEGIN 
    -- busines logic 
    iStep := 0; 
    FORALL TABLE_1 do delete; 
    iStep := 1; 
    FORALL TABLE_1 do update; 
    iStep := 2; 
    FORALL TABLE_1 do insert; 
    iStep := 3; 
    FORALL TABLE_2 do insert; 
    iStep := 4; 
    FORALL TABLE_2 do update; 
    iStep := 5; 
    FORALL TABLE_2 do insert; 
EXCEPTION 
    WHEN dml_errors then 

     FOR i IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP 
     DBMS_OUTPUT.PUT_LINE('Error #' || i || ' occurred during '|| 
      'iteration #' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX); 
      DBMS_OUTPUT.PUT_LINE('Error message is ' || 
      SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)); 
     END LOOP; 

     IF iStep = 0 THEN 
     ELSIF... 
     END; 
END; 
+0

Pourriez-vous expliquer l'étape dans votre bloc d'exception sinon else. comment/wat à implémenter –

+0

La valeur d'iStep change après chaque boucle forall, ainsi vous savez où il s'est écrasé. Le si/sinon si n'est pas nécessaire, je l'ai mis là pour vous donner une idée, mais je ne sais pas vraiment pourquoi vous voulez faire. Vous pouvez simplement afficher (dbms_output.put_line) l'étape. – Sebas

Questions connexes