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 :

Curseur récupère le résultat d'un autre 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
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Par défaut Curseur récupère le résultat d'un autre curseur
    Bonjour!

    Dans une procédure j'ai quatre curseurs différents, chacun correspondant à la valeur d'une option. Chacun de ces curseur renvoie plusieurs enregistrements, il faut donc que j'utilise une boucle.

    Mon problème, c'est que le traitement effectué dans cette boucle est assez lourd et comme c'est le même pour chaque curseur je n'ai pas envi de faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF w_option =1 THEN
        FOR w_c1 IN c1 LOOP
        ...
        END LOOP;
    ELSIF w_option =2 THEN
        FOR w_c2 IN c2 LOOP
        ...
        END LOOP;
    ELSIF ...
    Je me demandais donc s'il était possible de créer un curseur général qui "récupérerait" le SELECT d'un autre curseur. Cela donnerait quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF w_option =1 THEN
        OPEN c1 IN CURSOR c_general;
    ELSIF w_option =2 THEN
        OPEN c2 IN CURSOR c_general;
    ELSIF ...
    ...
    FOR w_general IN c_general LOOP
    ...
    END LOOP;
    Je sais qu'une solution aurait été de faire du SQL dynamique mais on m'a demandé d'essayer d'en trouver une autre.

    Une autre alternative aurait été d'ouvrir tout les curseurs et de tester l'option dans la boucle, comme suit:

    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
    OPEN c1;
    OPEN c2;
    OPEN c3;
    OPEN c4;
     
    LOOP
        IF w_option =1 THEN
            FETCH c1 IN w_c1;
        ELSIF w_option =2 THEN
            FETCH c2 IN w_c2;
        ELSIF ...
    END LOOP;
     
    CLOSE c1;
    CLOSE c2;
    CLOSE c3;
    CLOSE c4;
    Mais cette solution ne me plaît pas trop.

    C'est pourquoi je fais appel à votre aide en espérant avoir été assez clair.

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

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Par défaut
    sauf a ce que les curseur ne parcours pas les même tables tu peux
    peut être integrer le test des options dans le where
    Sinon regarde du coté des ref cursor peut être

  3. #3
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut ref cursor
    Bonjour,
    Un exemple:
    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
    set serveroutput on
    declare
    opt number:=2;
    type rectype is record ( a number);
    type curtype is ref cursor return rectype;
    c curtype;
    r rectype;
    begin
      case
       when opt = 1 then open c for select 1 from dual;
       when opt = 2 then open c for select 2 from dual;
      end case;
      loop
       fetch c into r;
       exit when c%NOTFOUND;
       dbms_output.put_line(r.a);
      end loop;
      close c;
    end;
    /
    exit;
    Cordialement,
    Franck.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Par défaut
    Merci à vous deux, Pachot l'exemple que tu as mis est exactement ce qu'il me faut.
    J'ai juste une petite question, est-ce qu'il faut gérer la fermeture du ref cursor comme celle d'un curseur classique (c-à-d avec un close curseur;)?

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Oui, bonne remarque. Il faut fermer tout ce qu'on ouvre.
    Je me permet de modifier le post pour ne pas laisser trainer un mauvais exemple.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Par défaut
    Ok, encore merci.

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

Discussions similaires

  1. Curseur dans un autre curseur
    Par Nimp0rtequi dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 19/04/2011, 17h01
  2. Réponses: 0
    Dernier message: 28/03/2011, 16h16
  3. Réponses: 5
    Dernier message: 04/07/2006, 11h19
  4. faire passer le curseur d'un input text à un autre automatiq
    Par calitom dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 04/04/2006, 10h21
  5. Réponses: 15
    Dernier message: 26/03/2004, 17h53

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