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

SQL Procédural MySQL Discussion :

[Procédure stockée] Générer un et renvoyer un curseur


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    522
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 522
    Points : 522
    Points
    522
    Par défaut [Procédure stockée] Générer un et renvoyer un curseur
    Salut,

    Dans une procédure stockée j'ai besoin de générer un curseur à la volée et de le retourner. Voyez-vous une solution ?

    Par exemple, j'ai 1 requête qui me renvoie un résultat. Je dois manipuler ce résultat pour former une nouvelle table de données et le renvoyer.

    La seule solution que je vois est de créer une table temporaire, compléter cette table avec les données trouvées et faire un select sur cette table pour renvoyer son contenu.

    Mais n'y a-t-il pas moyen de manipuler un curseur et de le retourner ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 331
    Points : 394
    Points
    394
    Par défaut
    Si j'ai bien compris ta demande, tu auras besoin d'un code du genre :

    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
    DELIMITER $$
    CREATE PROCEDURE demo()
    BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE b INT;
    DECLARE cur1 CURSOR FOR SELECT col1 FROM table_demo;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur1;
    REPEAT
    FETCH cur1 INTO b;
    IF NOT done THEN
    -- ton traitement ici
    SELECT b;
    END IF;
    UNTIL done END REPEAT;
    CLOSE cur1;
    END
    $$
    Rachid A.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    522
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 522
    Points : 522
    Points
    522
    Par défaut
    Non, ça je connais déjà. Voici ce que j'ai actuellement.

    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
     
    CREATE PROCEDURE p_sth_test2()
      BEGIN
     
          DECLARE a VARCHAR(50);
          DECLARE b INT;
          DECLARE c INT;
          DECLARE no_more_record INT;
          DECLARE cur1 CURSOR FOR SELECT value1, value2 FROM my_table;
          DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record=1;
     
          SET no_more_record=0;
          OPEN cur1;
          CREATE TEMPORARY TABLE temp1(value1 varchar(50), intNbPoint INT);
     
          record_loop:WHILE(no_more_record=0) DO
                FETCH cur1 INTO a, b;
                SELECT sum(intNbPoint) INTO c from mytable2  WHERE id = b;
                INSERT INTO temp1(value1, intNbPoint) values(a, c);
          END WHILE tag_record;
          CLOSE cur1;
     
          SELECT value1 as strXValue, intNbPoint as strYValue from temp1;
     
          DROP TABLE temp1;
     
          SET no_more_record=0;
    END;
    Pour faire simple, je n'ai pas mis tout le traitement. C'est un traitement assez complexe que je ne peux pas faire en une seule requête. Du coup, je passe par une table temporaire. Mais ça ne me satisfait pas (pourquoi, je ne sais pas trop en fait ..., pas terrible niveau perf j'imagine). Je voudrais plutôt créer une sorte de recordset dans la boucle et la renvoyer.

    Mais à la lecture de plusieurs docs, je crois que j'utilise la bonne solution.

Discussions similaires

  1. Réponses: 11
    Dernier message: 24/04/2009, 12h42
  2. Tester une procédure stockée renvoyant un curseur
    Par david71 dans le forum PL/SQL
    Réponses: 14
    Dernier message: 26/08/2008, 12h50
  3. procédure stockée pour renvoyer un état dans une application
    Par erickoffi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/10/2005, 19h05
  4. Réponses: 6
    Dernier message: 18/05/2005, 14h04
  5. [PL/SQL] Procédure renvoyant un curseur.
    Par KalHadj-Nikov dans le forum Oracle
    Réponses: 3
    Dernier message: 17/12/2004, 15h10

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