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

Requêtes MySQL Discussion :

Utilisation d'une variable dans une requête


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Par défaut Utilisation d'une variable dans une requête
    Bonjour,

    J'ai créé une procédure.
    Dans celle-ci j'interroge la base 'information_schema' pour sélectionner certaines tables de ma base de donnée.
    Pour chaque table trouvée je dois faire une requête 'alter table'.
    Mon problème est que je n'arrive pas à faire cette requête car le nom de la table est mal interpréter :
    Ci joint le code de ma fonction :
    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
     
    BEGIN
      DECLARE lDone INT DEFAULT 0;
     
      DECLARE lNomTable CHAR(64);
      DECLARE lNomColonne CHAR(64);
      DECLARE lType CHAR(64);
      DECLARE lCurs CURSOR FOR
        SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE  FROM information_schema.COLUMNS
        WHERE TABLE_SCHEMA='compta2'
        AND (COLUMN_NAME like 'idUtil%' OR COLUMN_NAME like 'util%') and data_type='tinyint'
        ORDER BY TABLE_NAME, DATA_TYPE;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET lDone = 1;
      OPEN lCurs;
      REPEAT
        FETCH lCurs INTO lNomTable, lNomColonne, lType;
        IF NOT lDone THEN
          ALTER TABLE compta2.lNomTable MODIFY COLUMN lNomColonne SMALLINT UNSIGNED NOT NULL;
        END IF;
      UNTIL lDone END REPEAT;
      CLOSE lCurs;
      END $$
    A l'exécution le message d'erreur est le suivant :
    Table 'compta2.lNomTable' doesn't exist

    Quelle est donc la syntaxe pour que ma requête alter table utilise le nom de la table référencée par la variable lNomTable ?

    D'avance merci.

  2. #2
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 514
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 514
    Par défaut
    Il n'est pas possible de faire une requête dont le nom de la table est présente dans un variable. Ceci serais un peut trop facile hein !
    La solution est d'utilisation la fonction EXECUTE. En faite, cette fonction est utilisé pour travailler avec les requêtes préparé mais il est possible d'utiliser pour executer du SQL écrit via une chaine de caractère. Donc avec ça, ton problème serait réglé.

    Si tu trouves pas, ce soir je peux te montrer un exemple d'une requête qui utilise un LIMIT mais le SQL n'accepte pas des données variables avec le LIMIT. Donc j'ai utilisé cette fonction.

    Par contre je suis obligé d'apposer cette image ci-dessus pour certifier que c'est du code de chien malade.

    "Certifié et approuvé 'technique de chien malade'"

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Par défaut
    Je te remercie pour ta réponse.
    J'ai essayé de l'appliquer mais lors de l'exécution, il ne fait pas le 'mailing' de la requête.
    Le 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
     
    BEGIN
      DECLARE lDone INT DEFAULT 0;
     
      DECLARE lNomTable CHAR(64);
      DECLARE lNomColonne CHAR(64);
      DECLARE lType CHAR(64);
      DECLARE lCurs CURSOR FOR
        SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE  FROM information_schema.COLUMNS
        WHERE TABLE_SCHEMA='compta2'
        AND (COLUMN_NAME like 'idUtil%' OR COLUMN_NAME like 'util%') and data_type='tinyint'
        ORDER BY TABLE_NAME, DATA_TYPE;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET lDone = 1;
      OPEN lCurs;
      REPEAT
        FETCH lCurs INTO lNomTable, lNomColonne, lType;
        IF NOT lDone THEN
     
          PREPARE lReqAlterTAble FROM 'ALTER TABLE ? MODIFY COLUMN ? SMALLINT UNSIGNED NOT NULL';
          SET @nomTable = CONCAT('compta2.',lNomTable);
          SET @nomColonne = lNomColonne;
          EXECUTE lReqAlterTAble USING @nomTable, @nomColonne;
     
        END IF;
      UNTIL lDone END REPEAT;
      CLOSE lCurs;
      END
    Le message d'erreur :

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? MODIFY COLUMN ? SMALLINT UNSIGNED NOT NULL' at line 1

    Où me suis trompé ?

  4. #4
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 514
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 514
    Par défaut
    C'est quasiment bon ce que tu as fais mais les ? ne peuvent être utilisé pour cela. Cette fois il faut utiliser la fonction CONTACT ou CONCATE_WS pour inclure ta variable dans ta chaine de caractère.

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Par défaut
    Impec, Merci pour ton aide.

  6. #6
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 514
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 514
    Par défaut
    Un affaire résolut donc

Discussions similaires

  1. Utiliser une valeur d'une variable dans une Macro
    Par ca_adrien dans le forum Macro
    Réponses: 7
    Dernier message: 01/08/2013, 14h14
  2. utilisation d'une variable d'une class dans une autre class
    Par the watcher dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2010, 14h01
  3. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  4. Réponses: 4
    Dernier message: 29/01/2008, 11h12
  5. Réponses: 1
    Dernier message: 15/02/2007, 00h24

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