Bonjour,
Sur une procedure PL/SQl, j'ai un petit souci de performance (ORACLE 9i).

Voici ma requete :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
		FOR i IN 1 .. listeParcelleRefId.count
      LOOP
				UPDATE ASSOCIATION a1 SET PARCELLE_REF_ID = idParcelleRefNew
WHERE a1.PARCELLE_REF_ID = listeParcelleRefId(i)
				AND exists (SELECT null FROM PARCELLE p , DOSSIER d
						    WHERE a1.PARCELLE_ID = p.PARCELLE_ID
							  AND p.DOSSIER_ID  = d.DOSSIER_ID
							  AND p.PARCELLE_PEC = 1
							  AND d.CAMPAGNE_ID = idNewCampagne_);
Cet update va se faire environ 200000 fois (à la louche) ce qui entraine que la sous requete de l'update est longue.
Ce qui est embetant, c est que cette sous requete est la même quelque soit l'instant de l'update.

J'ai essayé de récupérer tous les identifiants de la table ASSOCIATION est de les stocker dans une liste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
SELECT ASSOCIATION_ID BULK COLLECT INTO listeIdsAssociation FROM ASSOCIATION a, PARCELLE p , DOSSIER d
	    WHERE a.PARCELLE_ID = p.PARCELLE_ID
		  AND p.DOSSIER_ID  = d.DOSSIER_ID
		  AND p.PARCELLE_PEC = 1
		  AND d.CAMPAGNE_ID = idNewCampagne_;
 
FOR i IN 1 .. listeParcelleRefId.count
      LOOP	
UPDATE ASSOCIATION SET PARCELLE_REF_ID = idParcelleRefNew
				WHERE (listeIdsAssociation.EXISTS(ASSOCIATION_ID)) = TRUE;
Mais cela ne marche pas, il n'aime pas listeIdsAssociation.EXISTS(ASSOCIATION_ID).

Auriez vous une petite idée vers laquelle je pourrais m'orienter pour ne pas avoir à répéter la récupérations des lignes que je dois modifier, sachant qu'elle sera toujours la meme du début à la fin du traitement.

Merci d'avance.

Vincent