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 :

Rafraichissement d'un curseur


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut Rafraichissement d'un curseur
    Bonjour,

    Je cherche un moyen de rafraîchir le résultat d'un curseur ou de l'empêcher de ramener les lignes consécutives à la ligne courante du fetch. Je m'explique :

    J'ai un curseur ouvert sur une vue, vue qui ramène différents résultats en doublon. J'ai une table d'exclusion qui me permet d'exclure les résultats que je ne souhaite pas voir apparaître dans le résultat de la vue. En gros, le code simplifié fait :

    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
    Declare
     
    cursor C1 is
    select * from vue1 where not exists(select 1 from table_exclusion where vue1.id = table_exclusion.id);
     
    BEGIN
     
    OPEN C1;
    LOOP
       IF (vue1.xxxxx = 'ce que je veux') THEN
         INSERT INTO table_exclusion(id) values (C1.id);
       END IF;
    END LOOP;
     
    END;
    /
    Le fait est que les données ramenés par le curseur ne prennent pas en compte les données exclues par l'insertion dans la table table_exclusion.

    J'ai beau chercher, je sèche...
    Je n'ai trouvé que le contournement en faisant un rownum=1 sur ma vue et en révouvrant le curseur à chaque ligne cherchée : c'est pas très optimisé...

    J'ai oublié de préciser : je travaille sur Oracle 10G/HPUX11.

    Si vous avez une idée, je suis preneur !

    Merci d'avance.

    Aurélien

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Non, on ne peut pas.

    Par contre, vous pourriez probablement faire tout ceci en une seule requête, non ?

    Et sinon, si quelque chose dans la boucle justifie le procédural, rien n'empêche de vérifier dans la boucle que la condition d'exclusion n'est pas remplie :

    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 C1 is
    select * from vue1 where not exists(select 1 from table_exclusion where vue1.id = table_exclusion.id);
     
    l_check NUMBER;
     
    BEGIN
     
    OPEN C1;
    LOOP
    IF (vue1.xxxxx = 'ce que je veux') THEN
      SELECT count(id) INTO l_check FROM table_exclusion where table_exclusion.id = c1.id;
      IF (check =0) THEN
        INSERT INTO table_exclusion(id) values (C1.id);
      END IF;
    END IF;
    END LOOP;
    END;
    Bien sûr, c'est vraiment peu performant ... encore une fois, le mieux serait de gérer ceci en une seule requête (avec du fenêtrage pour ne récupérer qu'une ligne du curseur initial et éviter les doublons).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut
    Merci pour cette réponse (qui ne m'arrange pas mais merci quand même ).

    Je ne peux malheureusement pas appliqué ta méthode car les requêtes que j’exécute sont dynamiques (le code que j'ai indiqué dans mon premier post était une simplification du code).

    Je vais donc devoir fermer mon curseur à chaque résultat trouvé...

    Cdt,

    Aurélien

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Et si au lieu d’employer votre usine à gaz vous essayez d’éliminer les doublons via SQL? Et j’ai bien de doutes sur la "nécessité" de ces doublons.

  5. #5
    Membre éclairé Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Par défaut
    Je ne sais pas si je comprends bien le problème.
    à tout hasard voici du code pour détecter un doublon:

    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
    declare
     
    cursor c_emp is
       select  empno,
               ename
       from jbmemp
       order by ename;
     
      r_emp c_emp%rowtype;
      lv_save   jbmemp.ename%type;
    begin
     
      open c_emp;
      fetch c_emp into r_emp;
      lv_save := r_emp.ename;
      loop
         fetch c_emp into r_emp;
         exit when c_emp%notfound;
         if r_emp.ename = lv_save then
            dbms_output.put_line( 'Doublon:' || r_emp.ename || ' pour empno: ' || r_emp.empno );
         end if;
         lv_save := r_emp.ename;
         dbms_output.put_line( 'Nom: ' || r_emp.ename );
      end loop;
     
       close c_emp;
    exception
       when others then
          dbms_output.put_line( 'Exc: ' || sqlerrm );
    end;
    J'ai un LEROND en empno 101 et un autre en empno 108.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut
    Citation Envoyé par Jean_Benoit Voir le message
    Je ne sais pas si je comprends bien le problème.
    à tout hasard voici du code pour détecter un doublon:

    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
    declare
     
    cursor c_emp is
       select  empno,
               ename
       from jbmemp
       order by ename;
     
      r_emp c_emp%rowtype;
      lv_save   jbmemp.ename%type;
    begin
     
      open c_emp;
      fetch c_emp into r_emp;
      lv_save := r_emp.ename;
      loop
         fetch c_emp into r_emp;
         exit when c_emp%notfound;
         if r_emp.ename = lv_save then
            dbms_output.put_line( 'Doublon:' || r_emp.ename || ' pour empno: ' || r_emp.empno );
         end if;
         lv_save := r_emp.ename;
         dbms_output.put_line( 'Nom: ' || r_emp.ename );
      end loop;
     
       close c_emp;
    exception
       when others then
          dbms_output.put_line( 'Exc: ' || sqlerrm );
    end;
    J'ai un LEROND en empno 101 et un autre en empno 108.
    Merci mais les exclusions (pour empêcher les doublons) se trouvent dans une table. Ces valeurs sont multiples. Il faut donc que j'accède à cette table à chaque ligne rencontrée dans le vue1. Mais merci quand même.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Et si au lieu d’employer votre usine à gaz vous essayez d’éliminer les doublons via SQL? Et j’ai bien de doutes sur la "nécessité" de ces doublons.
    Je pense que le fait de gérer l'exclusion par SQL est l'usine à gaz contrairement à l'utilisation d'un not exist qui évite d'ouvrir un nouveau curseur. Mais je n'ai pas le choix et vais devoir utiliser cette solution. Merci de votre aide.

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Masquer le curseur en mode MS-DOS
    Par Alex120 dans le forum C
    Réponses: 2
    Dernier message: 10/07/2002, 09h30
  3. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09
  4. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54
  5. Position du curseur dans Edit
    Par MrJéjé dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 17h09

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