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 et "in" [MySQL-5.1]


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut procédure stockée et "in"
    Bonjour,

    je n'y connais pas grand chose à MySQL, et je n'ai pas trouvé comment écrire cette procédure stockée...

    Ici, ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE DEFINER=`gcetech`@`%` PROCEDURE `TSR`(
    IN REC_IDs varchar(50)
    )
    BEGIN
    	Select REC_REF
    	From RECO reco
    	where reco.REC_ID in (1,3,5);
    END
    Et ici ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE DEFINER=`gcetech`@`%` PROCEDURE `TSR`(
    IN REC_IDs varchar(50)
    )
    BEGIN
    	Select REC_REF
    	From RECO reco
    	where reco.REC_ID in (REC_IDs);
    END
    (le paramètre passé est "1,3,5")

    Pouvez-vous m'indiquer pourquoi, et comment corriger ce problème, s'il-vous-plait ? J'imagine que c'est simple, mais je n'ai pas trouvé d'article en parlant...

    Bonne journée !

  2. #2
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    c'est normal, oui c'est simple!

    ta variable est interprétée dans la requête comme une valeur unique qu'elle soit un nombre ou une chaine..., c'est un langage fortement typé le sql procédural (sauf les variables globales qui ne le sont pas)...

    si tu veux intégrer une liste de valeur comme ça tu dois mettre en place une requête préparée dans ta procédure:
    • tu commences par construire ta requête en y intégrant ta variable
    • tu prends la chaine résultante pour l'exécuter dans ta requête préparée

    ça donne le corps de ta procédure suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set @s=concat('SELECT REC_REF FROM RECO reco WHERE reco.REC_ID IN (',REC_IDs,')');
    prepare exe from @s;
    execute exe;
    deallocate prepare exe;
    ce qui te permet de rentrer dans le monde merveilleux de la programmation avancée et générique...

    ps:
    • quand tu mais un alias à une table celui ci est sensé être plus court que le nom qu'il remplace (c'est fait pour être fainéant et compacter l'écriture surtout bien sur)
    • idéalement il vaudrait mieux tester le contenu de ce qui est passé par la variable texte (surtout si ça vient de php ou autre truc externe) avant de l'injecter dans la requête...

  3. #3
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Bonjour,

    j'ai donc utilisé la requête dynamique, merci Eric.

    Pour la sécurité, j'ai utilisé un regex qui vérifie en entrée que ma liste de paramètre correspond à ce qui est attendu, de manière à éviter les injections.

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  3. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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