IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[PL/SQL] [9i] Comment faire autrement ?


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut [PL/SQL] [9i] Comment faire autrement ?
    Bonjour,

    Ci dessous mon code simplifié :

    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
     
    	requete := '
    		SELECT DISTINCT
    			A.ANNEE_DOSS_CS,
    			A.SEQ_DOSS_CS,
    			A.NO_DEM_SEQ,
    			B.NUM_CMR
    		FROM
    			RDD_DEM A,
    			RDD_HDE B
    		WHERE B.DEM_SEQ = A.NO_DEM_SEQ
    		AND A.DATE_FIN_CS < ''' || dateHisto || '''';			
     
    	EXECUTE IMMEDIATE requete BULK COLLECT INTO v_tab_annee, v_tab_seq, v_tab_dem, v_tab_cmr;
     
    	FOR i IN v_tab_annee.FIRST..v_tab_annee.LAST LOOP
     
    		requete := 'DELETE FROM RDD_HDO WHERE DOSSIER_ANNEE = '|| v_tab_annee(i) || ' AND DOSSIER_SEQ = ' || v_tab_seq(i) || ' AND NUMCMR = ' || v_tab_cmr(i);
    		EXECUTE IMMEDIATE requete;	
     
    		requete := 'DELETE FROM RDD_HDE WHERE DEM_SEQ = ' || v_tab_dem(i) || ' AND NUM_CMR = ' || v_tab_cmr(i);	
    		EXECUTE IMMEDIATE requete;	
     
    	END LOOP;
    Alors le souci c'est que la 1ère requête ramène +sieurs milliers de lignes, autant dire que la suite tombe vite dans les choux... D'un point de vue logique, l'algorithme ci dessus convient mais il ne semble pas réalisable d'un point de vue technique.

    Du coup, je me demande comment faire autrement sachant que j'ai besoin de faire la jointure de la 1ère requête pour savoir quels enregistrements je dois ensuite supprimer...

    Si vous avez des pistes de réflexion, je suis naturellement preneur !

    Frédéric

  2. #2
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Salut,
    regarde du côté de FORALL...

    tu trouveras tout ce qu'il te faut ici
    http://sheikyerbouti.developpez.com/...age=Chap5#L5.5

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Je ne vais pas répondre à ta question, mais je vais au contraire généraliser ta question, car il semble que tu aies le même problème que j'ai déjà rencontré, provenant du monde Sybase...

    Sous Sybase, il est possible de faire des DELETE et des UPDATE "directement" sur des résultats de jointure, ce qui semble impossible dans Oracle. Comment donc faire dans Oracle?

    (je pense d'ailleurs que tu pourrais faire ce que tu souhaites très simplement avec Sybase...)

    Petit exemple :

    1) DELETE
    Disons que j'ai deux tables A et B, et que je veuille deleter de A tous les rows dont la jointure avec B sur le champ Id ont pour champ Obsolete à 'YES' .
    Sous Sybase, cette syntaxe EST correcte (je n'ai malheureusement pas de Sybase sous la main pour la tester, étant désormais sous Oracle), mais rend une erreur de syntaxe sous Oracle :

    DELETE A
    FROM A, B
    WHERE A.Id = B.Id AND b.Obsolete = 'YES'

    2) UPDATE
    Un peu de la même façon, cette syntaxe est correcte sous Sybase mais pas sous Oracle :

    UPDATE A
    SET nouveau = 'YES'
    FROM A, B
    WHERE A.Id = B.Id AND B.nouveau = 'YES'

    Si quelqu'un peut en profiter pour répondre à ma question (pour le moment on m'a dit que le seul moyen était d'utiliser d'horribles requêtes imbriquées.... Dans ce cas d'exemple, ça ne serait pas trop grave, mais sur des DELETE ou UPDATE bien + complexes, ça devient vite très très lourd...).

    Merci d'avance!

    Nicolas.

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Mieux vaux faire 1 Gros DELETE que 1 million de petits DELETE.

    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
    DELETE FROM RDD_HDO hdo
    WHERE EXISTS (SELECT 1 
    			FROM  RDD_DEM a,  RDD_HDE b 
    			WHERE b.dem_seq 	= a.no_dem_seq 
    			AND a.date_fin_cs 	< datehisto         
    			AND a.annee_doss_cs = hdo.dossier_annee
    			AND a.seq_doss_cs 	= hdo.dossier_seq
    			AND b.num_cmr 		= hdo.numcmr
    			);
     
    DELETE FROM RDD_HDE  hde
    WHERE EXISTS (SELECT 1 
    			FROM  RDD_DEM a,  RDD_HDE b 
    			WHERE b.dem_seq 	= a.no_dem_seq 
    			AND a.date_fin_cs 	< datehisto         
    			AND A.NO_DEM_SEQ 	= hde.dem_seq
    			AND b.num_cmr 		= hde.numcmr
    			);

  5. #5
    Membre régulier
    Inscrit en
    Juin 2003
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 156
    Points : 85
    Points
    85
    Par défaut
    Merci !!
    Ca marche nickel avec Forall !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/09/2006, 10h46
  2. Script qui s'arrète !! Comment faire autrement ?
    Par Xplosif² dans le forum C++
    Réponses: 5
    Dernier message: 25/02/2006, 22h10
  3. [ADO.Net][C#/SQL 2005] Comment faire INSERT avec variable ?
    Par hduchemin dans le forum Accès aux données
    Réponses: 1
    Dernier message: 25/01/2006, 17h34
  4. [Vs.Net & SQL Serveur] Comment faire fonctionner le Débu
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 31/08/2005, 19h23
  5. Requête SQL complexe. Comment faire ....
    Par BilTCD dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/11/2004, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo