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 :

Curseur sur une requête dynamique


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par défaut Curseur sur une requête dynamique
    Bonjour à tous !

    J'ai un problème que je ne sais résoudre (je précise que je ne suis pas une foudre de guerre sur le PL/SQL).

    Ma base dispose de plusieurs tables crées dynamiquement appelées T_SERIE_idDeLaSerie (par exemple T_SERIE_1, T_SERIE_2, etc.).

    Je dois faire une procédure, recevant en paramètre l'id de la série, et bouclant sur chacune des lignes de la table correspondante afin de traiter les données de chaque ligne.

    Je suis donc parti là dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SET @s = CONCAT('SELECT * FROM T_SERIE_',noSerie);
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    Le truc c'est que je ne sais pas quoi faire après. Je ne peux pas utiliser de curseur pour boucler dessus, ni de LOOP. Bref, je suis un peu paumé. Est-ce qu'il y a une solution pour palier à mon problème?

    Merci d'avance

  2. #2
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut
    Bonjour Moustik...

    Tout d'abord, bienvenue parmi nous...

    Ensuite, petite correction, le PL/SQL c'est pour Oracle, il existe pas sous mysql, on parle de procédure stockée par ici, mais ceci n'est pas bien grave...

    Apparemment ta recherche concerne les requêtes préparés, dans ton cas, il s'agit d'une requête de selection "standard" il n'est donc pas utile de passé par la concaténation.

    En effet, la requête sera préparé au niveau de mysql et lors de son appel, elle sera exécuté en étant instancié par la valeur de la variable que l'on aura indiqué (euh, je suis pas sur d'être très clair là... )

    la syntaxe de préparation de requête est la suivante : PREPARE nom_requete FROM requete

    bref, le code (après correction de la requête) permettant de préparé la requête est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PREPARE stmt FROM  'SELECT * FROM T_SERIE idDeLaSerie = ?';
    le '?' correspond au paramètre passé lors de l'appel de la requête.

    La syntaxe pour exécuter une requete préparé est la suivante (avec paramètre) EXECUTE nom_requete_prepare USING nom_variable

    soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @noSerie = '1';
    EXECUTE stmt USING @noSerie;
    NB : (ne pas oublier d'instancier la valeur du paramètre avant l'appel...)

    Voilà, bonne continuation et bon courage

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par défaut
    Salut Lagnio et merci pour cette réponse très détaillée

    Je ne connaissai pas cette notion de requête préparée, j'ai un peu appris comme un barbare ^^'
    Ca me parait déjà plus souple ainsi, je vais modifier mon code en conséquence.

    Une fois la requête executée avec la commande EXECUTE, sais-tu si je peux boucler sur les résultats pour effectuer des traitements sur chaque ligne renvoyée par la requête?

  4. #4
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut
    Re- Moustik,

    la requête préparée te renverras un résultat comme une requête standard, donc en passant par un code php par exemple tu peux revenir sur le premier enregistrement facilement.

    Au niveau de mysql je pense que cela doit être possible via le curseur dans une procédure stockée mais je ne suis pas sur à 100% donc je vais faire quelques recherches et test et j'essaye de te répondre au plus vite...

    A plus pour de nouvelle infos...

  5. #5
    Membre confirmé
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Par défaut
    Bonjour,

    Dans mysql il est possible de parcourir le résultat via un curseur déclaré dans une procédure...

    L'utilisation des curseurs est relativement facile, il faut
    1 - le déclarer et l'instancié sur la requête source : DECLARE nom_cursor CURSOR FOR requête
    2 - l'ouvrir : OPEN nom_cursor;
    3 - tant que le curseur n'est pas vide, lire la ligne sur lequel pointe le curseur en instanciant des variables locales : FETCH nom_cursor INTO var1, var2;
    4 - traitement des données...
    5 - fermeture du curseur : CLOSE nom_cursor;
    6 - libération de la mémoire alloué au curseur : DEALLOCATE nom_cursor;

    NB : lorsque la fin du jeux de résultat est atteinte, l'erreur N°'02000' est levée, à utiliser pour sortir de la boucle...

    Bon passons à l'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
    DELIMITER //
    CREATE PROCEDURE cursor_noserie()
    BEGIN
       DECLARE exit_proc INT DEFAULT 0;  
       DECLARE var1 VARCHAR(20);
       DECLARE my_cursor CURSOR FOR SELECT * FROM T_SERIE;  
       DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET exit_proc = 1;
       -- Lorsque l'erreur 02000 exit_proc sera incrémenté à 1 et permettra de sortir de la boucle sans afficher d'erreur sur la sortie standard
       OPEN my_cursor; 
       REPEAT
           FETCH my_cursor INTO var1;
              -- Traitement des données...
       UNTIL exit_proc END REPEAT;
       CLOSE my_cursor;
       DEALLOCATE my_cursor;
    END //
    Voilà, si tu as d'autre question, n'hésites pas

    Bonne continuation

Discussions similaires

  1. Requête sur une requête dynamique...
    Par kluh dans le forum Access
    Réponses: 4
    Dernier message: 17/11/2005, 19h59
  2. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 11h12
  3. [DBLookupComboBox] Avoir un curseur sur une DBLookupCoboBox
    Par webbulls dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/05/2004, 11h52
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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