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 : 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;
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 !