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

PL/SQL Oracle Discussion :

PB avec Update dans une boucle FOR


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut PB avec Update dans une boucle FOR
    Bonjour à tous,

    Avant tout merci car votre forum m’a sauvé plus d’une fois.
    Voilà mon problème et n’hésitez à m’allumer si je m’exprime mal. Cela fait 3 jours que je cherche sur le web et je n’y arrive pas :

    En résumé :
    Je pars d’une table contenant x ise (possible doublon et c’est à tout à normal). Cette table est construite à partir d’une vue.
    Un ise dispose de 1 à n forfait.
    La logique que je veux faire c’est :
    Pour chaque ISE, je récupère son forfait (si monoforfait : RAS, par contre si bi forfait : je prends son max de forfait).  ici ce sera toujours qu’une seule ligne de récupérer.
    Ensuite dans des boites, je mets son code_ise, son forfait, et un id (unique pour chaque ligne)
    Enfin je fais un update sur cet ise en mettant son flag à 1.
    Admettons qu’au second passage, nous avons encore le meme ise, et bien, je récupère son autre forfait grâce au max(forfait) mais surtout grâce à ce flag à 1 précedemment mis à jour.
    /*
    Ici se trouve un bloc CASE assez conséquent mais ce n’est pas lui le problème, je l’ai donc retirer pour me focaliser sur l’erreur
    */

    Voici le code.
    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
    DECLARE 
    w_dt_1 		 DATE := null;
    w_dt_2 		 DATE := null;
    FORFAIT 		 INTEGER := 0;
    cd_ise_temp	 number := 0;
    no_lig_temp	 number := 0;
    flag_temp		 number := 0;
    FORFAIT_1		 number := 0;
    cd_ise_1		 number := 0;
    no_lig_2		 number := 0;
    cardinaliteLigne varchar2(150); 
    CURSOR crs IS select s.cd_ise from exploit.tempouview s ; 
     
    BEGIN
    	FOR list_ise IN crs
    	LOOP
    	FORFAIT_1 := 0 ; cd_ise_1 := 0 ; no_lig_2 := 0 ;
     
    	select z.FORFAIT, z.cd_ise, z.no_lig into FORFAIT_1, cd_ise_1, no_lig_2 from exploit.stat_aex_test z where z.FORFAIT in (select max(FORFAIT) from exploit.stat_aex_test 
    	where CD_ISE = list_ise.cd_ise and flagtraite <> 1) and z.flagtraite = 0 and ROWNUM <= 1 ;
     
    	UPDATE exploit.stat_aex_test zz set zz.flagtraite = 1 where zz.no_lig in (no_lig_2)  and zz.forfait in (FORFAIT_1) and zz.cd_ise in (cd_ise_1) ;
     
    	END LOOP;
    END;
    /
    • Avec 3 lignes tests dans stat_aex_test ça marche bien
    • Avec la totalité des lignes soit 4252. Ça marche pas  Error: ORA-01403: no data found
    ORA-06512: at line 17
    SQLState: 02000
    ErrorCode: 1403

    Une chose étrange, quand je mets en commentaire ce fameux update, la boucle se passe bien sur ces fameuses 4252 lignes. C’est donc pourquoi je pense que cela provient de l’update.
    J’espère que vous allez pouvoir m’éclairer.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 392
    Points
    28 392
    Par défaut
    Pour mieux comprendre l'origine de ton erreur, tu devrais récupérer les valeurs des variables pour lesquelles ton erreur est rencontrée.

    Il y a de fortes chances pour que ton problème soit d'ordre fonctionnel : tant que tu ne mets pas à jour ta table (UPDATE), tu peux y trouver des lignes qui répondent à la condition du SELECT ... INTO. En effectuant les mises à jour, ces lignes disparaissent puisqu'elles ne répondent plus à la condition et ... NO_DATA_FOUND !

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour ton retour si rapide,

    Et de plus, j'ai extremement honte car je viens de découvrir mon erreur. une erreur de débutant

    je remet mon code:
    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
    33
    34
    35
    36
    37
    38
    DECLARE 
    w_dt_1 		 DATE := null;
    w_dt_2 		 DATE := null;
    FORFAIT 		 INTEGER := 0;
    cd_ise_temp	 number := 0;
    no_lig_temp	 number := 0;
    flag_temp		 number := 0;
    FORFAIT_1		 number := 0;
    cd_ise_1		 number := 0;
    no_lig_2		 number := 0;
    CURSOR crs IS select s.cd_ise  from exploit.tempouview s ; 
    
    BEGIN
    
    	FOR list_ise IN crs
    	LOOP
    
    	select z.FORFAIT, z.cd_ise, z.no_lig 
    	into   FORFAIT_1, cd_ise_1, no_lig_2 
    	from exploit.stat_aex_test z 
    	where z.FORFAIT in (select max(FORFAIT) 
    					from exploit.stat_aex_test 
    					where CD_ISE 	= list_ise.cd_ise 
    					and flagtraite <> 1) 
    	and   z.flagtraite = 0 
    	and   ROWNUM 	<= 1 
    	and   cd_ise	 = list_ise.cd_ise;
    		
    	UPDATE exploit.stat_aex_test zz 
    	set zz.flagtraite 	= 1 
    	where zz.no_lig 	in (no_lig_2) 
    	and   zz.forfait 	in (FORFAIT_1) 
    	and   zz.cd_ise 	in (cd_ise_1) ;
    	
    	END LOOP;
    
    END;
    /
    Un oublie sur la jointure!!!! je suis vraiment stupide et je déteste faire perdre du temps aux autres.

    la procédure se passe sans soucis désormais.


    Vraiment désolé

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

Discussions similaires

  1. [Batch] Pb avec la commande "Findstr" dans une boucle "For"
    Par Salent dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 10/12/2012, 13h57
  2. Requête update dans une boucle for
    Par boubounagh dans le forum JDBC
    Réponses: 3
    Dernier message: 13/01/2012, 14h18
  3. Update dans une boucle avec valeur incrémentale
    Par framus.class dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/09/2008, 11h19
  4. Réponses: 2
    Dernier message: 28/08/2006, 18h17
  5. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22

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