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 :
Après tests en recette la boucle semble s'arrêter une fois l'exception générée, je m'y prendrais mal ?
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 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;
Merci pour vos éclaircissements !
Partager