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

DB2 Discussion :

Procédures stockées : requetes imbriquées


Sujet :

DB2

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut Procédures stockées : requetes imbriquées
    Salut,

    J'ai découvert les procédures stockées il y a quelques pour un projet professionnel, je suis entrain de convertir des procédures stockées d'informix vers DB2. J'ai donc une connaissance basique mais je bloque sur un cas spécifique où je dois renvoyer les informations de deux requêtes dont une est imbriquée à l'autre


    J'ai créée une procédure simple basée sur 2 requêtes

    - 1er curseur déclaré, je recupère sans problème un ensemble de données incluant un partenaire id
    - je crée un 2ème curseur pour récupérer le prénom & nom du partenaire (basé sur le résultat de la 1ère requête)

    Après je ne sais pas comment faire pour avoir l'affichage de mes résultats.

    Je m'oriente vers les boucles mais sans succès pour l'instant ...

    Comment dois-je faire ?

    Merci,


    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
    CREATE PROCEDURE test()
     
    BEGIN
     
    DECLARE contractNbr INT;
    DECLARE partNbr CHAR(40);
    DECLARE name char(40);
    DECLARE firstName char(40);
     
    DECLARE cur CURSOR WITH RETURN TO CLIENT FOR
     
     SELECT contract, partnr
     FROM contracts
     WHERE contract BETWEEN 1 AND 10
     ORDER BY contract;
     
     DECLARE cur2 CURSOR WITH RETURN TO CLIENT FOR
     SELECT name, firstName
     from pers
     where partnr = partNbr;
     
     SET CURRENT LOCK TIMEOUT WAIT;
     
     OPEN cur;
     FETCH cur INTO contract, partNbr;
    LOOP
     open cur2;
     FETCH cur2 INTO name, firstName;
    END LOOP; 
    END @

  2. #2
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    Sur quel DB2 es-tu ?
    Sur DB2 for i (DB2/400), pour tester une procédure, on passe par le requêteur SQL fournit par System i Navigator.

    Une procédure est faite pour être appelée en lui fournissant des paramètres et elle renvoie éventuellement des paramètres et des curseurs à l'appelant, charge à lui de les traiter.
    Pour renvoyer un curseur, il "suffit" de le déclarer en "with return to client" et de faire uniquement l'open. Si le close est effectué, le curseur n'est pas renvoyé.
    Dans ton exemple, il ne faut pas parcourir le curseur pour l'afficher, il faut juste l'ouvrir pour le renvoyer.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    Voilà, pour exposer l'idée sur quelque chose qui fonctionne à moitié

    J'ai maintenant un curseur qui récupère les informations de ma 1ère requête
    Je boucle avec un while sur le curseur pour récuperer l'id de la personne
    Lorsque j'ai récupéré l'id, j'exécute la 2ème requete pour récuperer l'adresse pour cet id (la personne)

    lorsque j'exécute la procédure, j'ai les informations que je souhaite mais uniquement pour le dernier record

    Comment faire pour qu'il m'affiche les autres records ? Note le but est bien de ne pas utiliser de join même si cela résout le problème



    => vite fait : résultat 1ère requete

    id name
    ----------------------------
    1 Cédric
    2 Martin
    3 Kim
    ...


    Résultat de la 2ème requête :

    1ère boucle
    adresse
    ---------------
    Rue du Test


    2ème boucle:
    adresse
    ---------------
    Rue de la gare

    3ème boucle:
    adresse
    ---------------
    Rue de la liberté



    Résultat que je souhaite à la fin de la procédure
    id name adresse
    ---------------------------------------------
    1 Cédric Rue du Test
    2 Martin Rue de la gare
    3 Kim Rue de la liberté
    ...



    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
    CREATE PROCEDURE TestCursor(OUT idPers INT,
     OUT namePers CHAR(30),
     OUT streetPers CHAR(20))
     
    BEGIN
     
    DECLARE idPers INT;
    DECLARE name CHAR(30);
    DECLARE street CHAR(20);
     
    DECLARE eof SMALLINT DEFAULT 0;
     
    DECLARE cur CURSOR WITH RETURN FOR
      SELECT id, name
      FROM pers
      WHERE id < 10
     
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
      SET eof = 1;
     
    OPEN cur;
    WHILE eof = 0
    DO
      FETCH cur INTO idPers, name;
     
      SELECT streetName
      INTO street
      FROM adr
      WHERE id = idPers and adnr = 1
      FETCH FIRST 1 ROWS ONLY;
     
      SET idPers = id;
      SET namePers = name;
      SET streetPers = street;
     
    END WHILE;
     
    END @

  4. #4
    Membre actif
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Points : 275
    Points
    275
    Par défaut
    Le plus simple me semble de faire une requête SQL avec des jointures, ceci afin de ne faire qu'un seul curseur à renvoyer.

Discussions similaires

  1. [ASA 8] Procédure stockée et requete dynamique
    Par Xavier38 dans le forum Sybase
    Réponses: 3
    Dernier message: 14/02/2006, 15h20
  2. [SQL-Server] Sous requete dans une procédure stockée
    Par Worldofdada dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 09/02/2006, 11h18
  3. 2 Requetes en une seule procédure stockée
    Par jeff37 dans le forum Oracle
    Réponses: 3
    Dernier message: 14/11/2005, 15h43
  4. Procédures stockées imbriquées
    Par Didier L dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/07/2004, 10h14
  5. Procédures stockées imbriquées SQL Server
    Par Mike69 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/10/2003, 10h31

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