Exception mais continuer boucle 8i
Bonjour,
Sur oracle 8i j'ai un petit soucis en PL/SQL : je créé un curseur à partir d'une table A pour mettre à jour un champ d'une table B en faisant une égalité sur 2 autres champs. Les 3 champs sont la PK de la table B, qui au passage fait 100 millions de lignes (mettre un not in la table B dans la clause where de l'update est trop lourd).
Problème, dans certains rares cas, le fait de mettre à jour le champ engendre une violation de la PK, il faut donc gérer l'exception DUP_VAL_ON_INDEX, sans arrêter la boucle sur le curseur. On ne fait rien dans ce cas, on tente juste de mettre à jour à partir de la ligne suivante du curseur.
Exemple ci-dessous :
Code:
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
| DECLARE
CURSOR C1 is
SELECT ATT1,ATT2,ATT3
FROM MATABLE1;
C1ROW C1%ROWTYPE;
BEGIN;
OPEN C1;
LOOP
FETCH C1 INTO C1ROW;
EXIT WHEN C1%NOTFOUND;
UPDATE MATABLE2 T2
set T2.ATT3=C1ROW.ATT3
where T2.ATT1=C1ROW.ATT1
and T2.ATT2=C1ROW.ATT2
and T2.ATT3<>C1ROW.ATT3
END LOOP;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN NULL;
CLOSE C1;
COMMIT;
END; |
Après tests en recette la boucle semble s'arrêter une fois l'exception générée, je m'y prendrais mal ?
Merci pour vos éclaircissements !
Portée des variables en PLSQL
Merci pour cette réponse rapide, j'essaierai demain au boulot.
Par contre ce qui me surprend c'est qu'une variable en PLSQL est locale au bloc PLSQL, or dans le BEGIN compris dans la boucle, les variables C1ROW.ATT1, 2 et 3 ont été définies dans le bloc englobant.