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

SQL Oracle Discussion :

2 update avec un curseur probleme


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Points : 59
    Points
    59
    Par défaut 2 update avec un curseur probleme
    Bonjour a tous,

    j ai un petit probleme avec mon bloc pl/sql.

    Je veux faire des updates sur 2 tables dans un bloc pl/sql.

    Je verouille d'abord mes champs via un curseur.

    Apres execution du bloc, aucune modifications n'a eu lieu.

    Si je fais des bloc PL/SQL avec chacun un update sur une table, ca fonctionne.

    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 cur_maj is
       select 
    	p.statutproduit,
    	r.CODEGUICHET
       from test_crm p, test_rib r
       where r.CODEGUICHET = 1
       and p.statutproduit = r.CODEGUICHET
     
           for update of 
             p.statutproduit, 
             r.CODEGUICHET;
      nb_lg NUMBER :=0;
      date_debut DATE := sysdate;
    begin
      execute immediate('alter session set nls_date_format=''DD/MM/YYYY''');
      for cur_t in cur_maj loop
     
        update test_crm p
           set p.statutproduit = 9
         where current of cur_maj;
     
        update test_rib r
           set r.CODEGUICHET = '87000'
         where current of cur_maj;
     
        nb_lg := cur_maj%ROWCOUNT;
        dbms_output.put_line('TTTTTT- Nombre de lignes : '||nb_lg);
      end loop;
      dbms_output.put_line('- Nombre de lignes : '||nb_lg);
    end;
    /
    Je pense que mon probleme vient du where current of cur_maj que j'utilise dans mes 2 update. Est-ce que le fait d'update le premier, modifie le curseur et ensuite plus dispnible pour le 2 update.( puisque si on refait le select de l'update, il ne serait plus contenu dedans)

    J'ai également testé de mettre un commit, avant et apres le "end loop", sans succes.

    Je fais peut etre fausse route, avez-vous des idees ?

    Une derniere question, comment peut on savoir si un update s'est bien déroulé en pl/sql ? (en mode normale on a un 1 ligne mise a jour)

    Merci d avance

    Cordialement

  2. #2
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Peux-tu essayer cela :
    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
    declare
      cursor cur_maj is
       select 
    	p.statutproduit,
    	r.CODEGUICHET
       from test_crm p, test_rib r
       where r.CODEGUICHET = 1
       and p.statutproduit = r.CODEGUICHET
    
           for update of 
             p.statutproduit, 
             r.CODEGUICHET;
      nb_lg NUMBER :=0;
      date_debut DATE := sysdate;
    begin
      execute immediate('alter session set nls_date_format=''DD/MM/YYYY''');
      for cur_t in cur_maj loop
    
        update test_crm p
           set p.statutproduit = 9
         where p.statutproduit = cur_t.statutproduit ;
    
        update test_rib r
           set r.CODEGUICHET = '87000'
         where r.CODEGUICHET = cur_t.CODEGUICHET ;
    
        nb_lg := cur_maj%ROWCOUNT;
        dbms_output.put_line('TTTTTT- Nombre de lignes : '||nb_lg);
      end loop;
      dbms_output.put_line('- Nombre de lignes : '||nb_lg);
    end;
    /
    Une derniere question, comment peut on savoir si un update s'est bien déroulé en pl/sql ? (en mode normale on a un 1 ligne mise a jour)
    Tu peux tester le SqlCode.

    LBO72.

  3. #3
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    J'ai fait quelques tests de mon côté et effectivement, cela n'update pas

    Par contre, tu peux arriver à un résultat similaire en ajoutant des rowid

    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
    declare
      cursor cur_maj is
       select 
        p.statutproduit,
            p.rowid as RI1
        r.CODEGUICHET,
            r.rowid as RI2
       from test_crm p, test_rib r
       where r.CODEGUICHET = 1
       and p.statutproduit = r.CODEGUICHET
    
           for update of 
             p.statutproduit, 
             r.CODEGUICHET;
      nb_lg NUMBER :=0;
      date_debut DATE := sysdate;
    begin
      execute immediate('alter session set nls_date_format=''DD/MM/YYYY''');
      for cur_t in cur_maj loop
    
        update test_crm p
           set p.statutproduit = 9
         where rowid = cur_t.RI1;
    
        update test_rib r
           set r.CODEGUICHET = '87000'
         where rowid = cur_t.RI2;
    
        nb_lg := cur_maj%ROWCOUNT;
        dbms_output.put_line('TTTTTT- Nombre de lignes : '||nb_lg);
      end loop;
      dbms_output.put_line('- Nombre de lignes : '||nb_lg);
    end;
    /
    J'ai testé et cela marche en 10g

  4. #4
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    La solution de loyd1974 est encore mieux. En passant les RowId, les perfs seront meilleurs

    LBO72.

Discussions similaires

  1. probleme update avec where sur requete imbriqué
    Par JulienCEA dans le forum Requêtes
    Réponses: 11
    Dernier message: 04/06/2008, 11h44
  2. MySQL: Probleme d'UPDATE avec sous requete SELECT
    Par simonius dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/11/2007, 14h57
  3. [MySQL] Probleme UPDATE avec boucle WHILE
    Par iverson_mac dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 17h07
  4. Probleme UPDATE avec date
    Par shub dans le forum Access
    Réponses: 7
    Dernier message: 21/06/2006, 13h39
  5. Probleme Update avec chamd decimal
    Par ouellet5 dans le forum Access
    Réponses: 1
    Dernier message: 14/10/2005, 10h57

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