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 dans un curseur


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 20
    Points : 19
    Points
    19
    Par défaut Curseur dans un curseur
    Bonjour,

    Je cherche à faire un curseur dans un curseur.
    Le but est de parcourir une table, qui passera un parametre à 2 autres tables ensuite que je parcourai ensuite.

    Je ne vois pas comment m'y prendre...

    Merci de votre aide.


    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
    38
    DECLARE
     
    -- Mes variables
    MonEmploye kheops_heures_operateurs.codeemploye%TYPE;
    MaDate kheops_heures_operateurs.datedemandenum%TYPE;
     
    DHD_Pause kheops_heures_operateurs.dateheuredebut%TYPE;
    DHF_Pause kheops_heures_operateurs.dateheurefin%TYPE;
     
    -- j'ai la liste des operateurs de la journée
    CURSOR MESEMPLOYES IS
    select datedemandenum,codeemploye from kheops_heures_operateurs where datedemandenum = 20150630 group by datedemandenum,codeemploye;
     
    BEGIN
     
      OPEN MESEMPLOYES;
     
        LOOP
     
          -- passage de parametre date et employe en lisant le curseur
         FETCH MESEMPLOYES INTO MaDate,MonEmploye;
     
         DBMS_OUTPUT.PUT_LINE(MonEmploye||'    '||MaDate);
         -- Test si je n'ai plus rien a lire
         EXIT WHEN MESEMPLOYES%NOTFOUND;
     
      -- je prends tous les postes de production sur un operateur
       select dateheuredebut,dateheurefin into DHD_Pause,DHF_Pause from kheops_heures_operateurs
       where datedemandenum = MaDate and codeemploye = MonEmploye
       and not exists (select 'f' from kheops_cdc_horsproduction where kheops_cdc_horsproduction.code_cdc=kheops_heures_operateurs.code_cdc);
     
     
     
        END LOOP;
     
      CLOSE MESEMPLOYES;
     
    END;

  2. #2
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Faites des jointures c'est bien pour cela que les bases des données sont nées!

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 20
    Points : 19
    Points
    19
    Par défaut
    Oui, merci

    Mais, ce que je souhaite faire plus précisément, c'est lire la premiere requete, qui me passe un paramètre.

    Puis lancer une 2eme requete à partir d'un paramètre de la première.
    Et je ne veux absolument le faire en 2 requetes !!

  4. #4
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Et ça s'appelle faire une jointure en Pl/SQL ce qui est un mauvais façon de programmer.

    Mais au delà de ces considérations sur comment faire correctement les choses je ne comprends pas votre problème: si vous voulez utiliser un deuxième curseur c'est le même type de code à écrire que sur le premier: le déclarer, l'ouvrir, ramener l'enregistrement courant, tester l'existence des autre enregistrements et le fermer à la fin. De plus un curseur accepte des paramètres quoi que le code mal écrit peut se baser juste sur une variable globale pour transmettre la valeur au curseur.

  5. #5
    Membre confirmé
    Homme Profil pro
    xxxxxxxxx
    Inscrit en
    Avril 2015
    Messages
    392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : xxxxxxxxx

    Informations forums :
    Inscription : Avril 2015
    Messages : 392
    Points : 552
    Points
    552
    Par défaut curseurs_imbriqués
    voici qques changement de ton code,
    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
    38
    39
    40
    41
    42
    43
     
    DECLARE
     
    -- Mes variables
    MonEmploye kheops_heures_operateurs.codeemploye%TYPE;
    MaDate kheops_heures_operateurs.datedemandenum%TYPE;
     
    DHD_Pause kheops_heures_operateurs.dateheuredebut%TYPE;
    DHF_Pause kheops_heures_operateurs.dateheurefin%TYPE;
     
    -- j'ai la liste des operateurs de la journée
    CURSOR MESEMPLOYES IS
    select datedemandenum,codeemploye from kheops_heures_operateurs where datedemandenum = 20150630 group by datedemandenum,codeemploye;
    -- le deuxième curseur correspondant  à la deuxième requête
    CURSOR   C_BIS (param1, param2) is 
     select dateheuredebut,dateheurefin into DHD_Pause,DHF_Pause from kheops_heures_operateurs
       where datedemandenum = param1 and codeemploye = param2
       and not exists (select 'f' from kheops_cdc_horsproduction where kheops_cdc_horsproduction.code_cdc=kheops_heures_operateurs.code_cdc);
    BEGIN
     
      OPEN MESEMPLOYES;
     
        LOOP
     
          -- passage de parametre date et employe en lisant le curseur
         FETCH MESEMPLOYES INTO MaDate,MonEmploye;
     
         DBMS_OUTPUT.PUT_LINE(MonEmploye||'    '||MaDate);
         -- Test si je n'ai plus rien a lire
         EXIT WHEN MESEMPLOYES%NOTFOUND;
     
      -- ouverture du deuxième curseur avec les param1 et param2 correspondant aux MaDate, MonEmploye
                 open C_BIS (Madate,MonEmploye);
                 LOOP
                      fetch C_bis into  var1, var2 ;
                      exit when c_Bis%notfound ;
                      dbms_output.put_line('affichage de resultats des var1, var2);
                 end loop;
                 close C_Bis ;
        END LOOP;
      CLOSE MESEMPLOYES;
     
    END;
    Ne pas oublier de déclarer les var1 et var2 (variables réceptrices du résultat de la requête C_BIS

  6. #6
    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
    Je vous conseille fortement de privilégier les FOR LOOP plutôt que les OPEN CURSOR quand c'est possible (c'est à dire quand il n'y a pas de curseur dynamique) : Plus rapide, plus fiable [gestion de fermeture de curseur automatique], plus lisible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BEGIN
     FOR r1 IN (SELECT datedemandenum,codeemploye FROM KHEOPS_HEURES_OPERATEURS WHERE datedemandenum = 20150630 GROUP BY datedemandenum,codeemploye)
     LOOP
       DBMS_OUTPUT.PUT_LINE(r1.codeemploye||'    '||r1.datedemandenum);
     
         FOR r2 IN (SELECT dateheuredebut,dateheurefin 
         	 FROM KHEOPS_HEURES_OPERATEURS a
             WHERE datedemandenum = r1.datedemandenum AND codeemploye = r1.codeemploye
             AND NOT EXISTS (SELECT 1 FROM KHEOPS_CDC_HORSPRODUCTION b WHERE b.code_cdc = a.code_cdc))
         LOOP
              dbms_output.put_line(r2.dateheuredebut ||' '|| r2.dateheurefin);
         END LOOP;
      END LOOP;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Brésil

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 14
    Points : 20
    Points
    20
    Par défaut
    Je suis tout à fait d'accord avec mnitu:
    Citation Envoyé par mnitu Voir le message
    Faites des jointures c'est bien pour cela que les bases des données sont nées!

    Je pense qu'on peut résoudre ce probème simplement avec une seule requête, comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT dateheuredebut
          ,dateheurefin
      INTO dhd_pause
          ,dhf_pause
      FROM kheops_heures_operateurs
     WHERE datedemandenum = 20150630
       AND NOT EXISTS
     (SELECT 1
        FROM kheops_cdc_horsproduction
       WHERE kheops_cdc_horsproduction.code_cdc = kheops_heures_operateurs.code_cdc);

    Je n'ai pas compris le 'f' dans la ligne original puisque le valeur ici n'importe rien. Peut-être que 'f' soit un valeur d'un champ de la table kheops_cdc_horsproduction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and not exists (select 'f' from kheops_cdc_horsproduction where kheops_cdc_horsproduction.code_cdc=kheops_heures_operateurs.code_cdc);
    Il y a encore, je crois, d'utilisation non nécessaire de la table kheops_heures_operateurs. Elle est utilisé deux fois quand on besion seulement d'une fois.

Discussions similaires

  1. syntaxe pour un curseur dans un curseur
    Par Cindy28 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 27/01/2009, 11h48
  2. Réponses: 3
    Dernier message: 26/07/2007, 10h13
  3. Obtenir la position du curseur dans une Image
    Par bastoune dans le forum Composants VCL
    Réponses: 6
    Dernier message: 14/11/2003, 21h02
  4. Position du curseur dans un TMemo
    Par yokito dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/08/2003, 16h35
  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