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 :

Problème renumbering


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 55
    Points : 41
    Points
    41
    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 : 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
     
    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

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    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)

  3. #3
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    a ton avis laquelle est la bonne solution?

  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
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    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
    Regardes si ces updates peuvent remplacer. (Faut vérifier la cohérence avec les PK, et les données à mettre à jour)
    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
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 15h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 12h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 22h11

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