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 :

Problème de cursor


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut Problème de cursor
    Je cherche à copier une table dans une autre. Pour chaque enregisrement je veux vérifier que le code de l'enregistrement est contenu dans la table de destination. S'il est bien contenu, je vais un update de la ligne sinon je dois refusé l'importation de la ligne et loggé l'erreur.
    Mon problème c'est que mon update ne se déclenche jamais et je ne sais pas comment faire pour logger l'information en cas de refus d'importation.

    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
     
     
    DECLARE  
     
      TYPE recordTypeFlux IS RECORD
        (
          libelle tmp_type_flux.tf_libelle%TYPE,
          code tmp_type_flux.tf_code%TYPE
        );
     
      rec recordTypeFlux;
     
      CURSOR CurseurTypeFlux IS select tf_libelle , tf_code from tmp_type_flux;
      CURSOR ExisteTypeFlux IS select * from type_flux where type_flux.code_type_flux = rec.code;
     
    BEGIN   
     
      OPEN CurseurTypeFlux;
      OPEN ExisteTypeFlux;   
     
      dbms_output.put_line('1');
     
      LOOP   
        FETCH CurseurTypeFlux INTO rec;
          EXIT WHEN CurseurTypeFlux%NOTFOUND;
     
        If ExisteTypeFlux%NOTFOUND Then
          update type_flux set libelle_type_flux = rec.libelle;
          /* insert into type_flux(libelle_type_flux, code_type_flux) values (rec.libelle,rec.code); */
        END If;
     
      END LOOP;
     
      CLOSE CurseurTypeFlux;
      CLOSE ExisteTypeFlux;
      COMMIT;
    END;

  2. #2
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    est-ce du PL/SQL sur Oracle ?
    Car si c'est le cas le forum Oracle sera peut-être mieux pour avoir une réponse.

    Je ne connais pas Oracle.

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    C'est du PL/SQL, non ? Pourquoi ne pas avoir posté dans le forum oracle ?

    Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ExisteTypeFlux%NOTFOUND Then
    alors que tu n'as pas fait de fetch sur ce curseur, il ne peut donc jamais faire d'update.

    Par ailleurs, la déclaration de ton curseur ExisteTypeFlux est fausse, en effet dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where type_flux.code_type_flux = rec.code;
    rec.code est null au moment de la déclaration, ta condtion ne sera jamais respectée. Tu dois donc passer par un paramètre au niveau de ton curseur ou faire un simple select (mieux au niveau perf).

    Voici ton script corrigé :
    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  
      TYPE recordTypeFlux IS RECORD 
        ( 
          libelle tmp_type_flux.tf_libelle%TYPE, 
          code tmp_type_flux.tf_code%TYPE 
        ); 
     
      rec recordTypeFlux; 
     
      CURSOR CurseurTypeFlux IS 
             select tf_libelle , tf_code from tmp_type_flux; 
      CURSOR ExisteTypeFlux (rec_code tmp_type_flux.tf_code%TYPE) IS 
             select * from type_flux where type_flux.code_type_flux = rec_code; 
      rec2 ExisteTypeFlux%rowtype;
    BEGIN    
     
      OPEN CurseurTypeFlux; 
     
      dbms_output.put_line('1'); 
     
      LOOP    
         FETCH CurseurTypeFlux INTO rec; 
      EXIT WHEN CurseurTypeFlux%NOTFOUND; 
         OPEN ExisteTypeFlux (rec.code);
         FETCH ExisteTypeFlux INTO rec2;
         If ExisteTypeFlux%NOTFOUND Then 
            update type_flux set libelle_type_flux = rec.libelle; 
            /* insert into type_flux(libelle_type_flux, code_type_flux) values (rec.libelle,rec.code); */ 
         END If; 
         CLOSE ExisteTypeFlux; 
      END LOOP; 
      CLOSE CurseurTypeFlux; 
      COMMIT; 
    END;
    et voici une version optimisé de celui-ci :
    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
    DECLARE  
      CURSOR CurseurTypeFlux IS 
             select tf_libelle , tf_code from tmp_type_flux;
      v_exist number(1); 
    BEGIN    
      FOR rec in CurseurTypeFlux LOOP
         begin
           select 1
           into v_exist
           from type_flux 
           where type_flux.code_type_flux = rec_code
             and rownum = 1;
         exception 
            when no_data_found then
                update type_flux set libelle_type_flux = rec.libelle; 
                /* insert into type_flux(libelle_type_flux, code_type_flux) values (rec.libelle,rec.code); */ 
         end;
      END LOOP; 
      COMMIT; 
    END;
    Qu'appelles-tu loggé l'information ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Merci beaucoup... par loggé j'entends renseigner un fichier de le log en lui disant que la ligne contenant le code et le libelle x ne peut etre insérée

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Dans ce cas il faut que tu utilises le package utl_file. Pour plus d'infos sur ce package :
    http://sheikyerbouti.developpez.com/pl_sql/?page=Chap8

  6. #6
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Ca fait la 2° fois en 2 jours que je déplace un de tes sujet sur le forum Oracle, merci de jeter un oeil à tes mp

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

Discussions similaires

  1. Problème Count dans un cursor
    Par zak2632 dans le forum Développement
    Réponses: 2
    Dernier message: 05/08/2009, 09h58
  2. problème Data cursor
    Par El_bennito dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 13/07/2009, 11h39
  3. Problème avec un cursor
    Par *alexandre* dans le forum Développement
    Réponses: 4
    Dernier message: 12/03/2009, 08h59
  4. [PB 6.5] Problème cursor avec DB Oracle 10
    Par TIGROUJ dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 04/12/2008, 15h39
  5. :aie: [ Cursor / Package ] - Problème de syntaxe
    Par jacquesh dans le forum SQL
    Réponses: 4
    Dernier message: 22/07/2007, 22h31

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