Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/07/2008, 11h12   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2006
Messages : 55
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 55
Points : 10
Points : 10
Par défaut Problème renumbering

Bonjour , j'ai un prob dans le curseur.
Je veux faire renumbering sur toutes les transactions de chaque mois (renumbering reset on each month).
Voila ma procedure:
Code :
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
 
declare
  cursor c1 IS 
     SELECT   acc_hd_id, tr_date
       FROM   acc_hd
      WHERE bra = '02' 
        AND trdate BETWEEN add_months(to_date('01/01/2007','dd/mm/yyyy'),i) AND last_day(add_months(to_date('01/01/2007','dd/mm/yyyy'),i))
     ORDER BY trdate, acc_hd_id;
  c11 c1%rowtype;
 x number;
 i number;
begin
  i := 0;
  x := 0;
  open c1;
    loop
    fetch c1 INTO c11;
    exit when c1%notfound;
     x  := x + 1;
       begin
         UPDATE acc_hd
         SET no_hd_id = x
         WHERE acc_hd_id = c11.acc_hd_id;
       end;
       begin
         UPDATE acc
         SET no_id = x
         WHERE acc_id = c11.acc_hd_id;
       end;
  i := i+1;
    end loop;
  close c1;
end;
/
le prob est que cette procedure fait renumbering pr le 1er mois slt cad pour le mois de janvier du 2007.
Merci d'avance
jamjam19 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2008, 11h29   #2
Membre éclairé
 
Inscription : août 2005
Messages : 316
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : août 2005
Messages : 316
Points : 342
Points : 342
le select est fait sur l'open du curseur
or l'ingrément de i est dans la boucle du fetch
donc le curseur n'est jamais ré-executer avec la nouvelle valeur de i
Mais même en le deplacement du coup il te faut une condition pour arreter
la boucle d'ingrementation de i
(en fait je ne suis pas sur de ce que tu veux faire et je ne suis pas sur que ce
soit la methode la mieux adaptée)
c.langlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2008, 11h36   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2006
Messages : 55
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 55
Points : 10
Points : 10
a ton avis laquelle est la bonne solution?
jamjam19 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2008, 11h38   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
C'est normal, quand tu ouvres le curseur, i vaut 0

Il faudrait passer la variable i (en passant c'est redondant avec x) dans le curseur.

y'a un moyen de faire exactement pareil, mais c'est pas optimisé.
En admettant que tu boucles à chaque fois et que i soit incrémenté, tu t'arrêtes dès que tu ne trouves pas une ligne dans acc_hd.
Donc s'il y a les mois 1,2,4. Ca ne mettra à jour que 1 et 2, ou faut-il aussi mettre le mois 4 à jour.
Si oui, tu peux le faire en 2 updates.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2008, 11h43   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Regardes si ces updates peuvent remplacer. (Faut vérifier la cohérence avec les PK, et les données à mettre à jour)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
UPDATE ACC a
SET no_id = (SELECT FLOOR(MONTHS_BETWEEN(trdate, TO_DATE('01/01/2007','dd/mm/yyyy'))) + 1
		FROM ACC_HD
		WHERE bra = '02' 
                 AND acc_hd_id = a.acc_id
             )
WHERE acc_id IN (
		SELECT acc_hd_id
		FROM ACC_HD
		WHERE bra = '02' 
		AND trdate >= TO_DATE('01/01/2007','dd/mm/yyyy')
		);
 
UPDATE ACC_HD
SET no_hd_id = FLOOR(MONTHS_BETWEEN(trdate, TO_DATE('01/01/2007','dd/mm/yyyy'))) + 1
WHERE bra = '02' 
AND trdate >= TO_DATE('01/01/2007','dd/mm/yyyy')
Edit : Correction du months_between (mis un floor+1)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h15.


 
 
 
 
Partenaires

Hébergement Web