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 :

Problème de "variabilisation" dans une procédure stockée


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut Problème de "variabilisation" dans une procédure stockée
    Bonjour,

    Dans le but de connaitre l'utilisation des colonnes TEXT d'une table, j'ai créé cette procédure:
    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 ColonneTEXT varchar(100) DEFAULT "";
        DECLARE total varchar(5000) DEFAULT "";
        DECLARE LGMOY decimal(11,4) DEFAULT 0;
        DECLARE LGMAX decimal(11,4) DEFAULT 0;
        DECLARE fin BOOLEAN DEFAULT 0;
        DECLARE c2 CURSOR FOR
         SELECT COLUMN_NAME FROM information_schema.COLUMNS 
             WHERE DATA_TYPE="TEXT" 
                   AND TABLE_NAME="MaTable" 
                   AND TABLE_SCHEMA="MonSchema";
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = TRUE;
        OPEN c2;
        REPEAT
            FETCH c2 INTO ColonneTEXT;
     
            SELECT MAX(LENGTH(ColonneTEXT)) INTO LGMAX FROM `MaTable`;
            SET total = CONCAT (total,ColonneTEXT," ", CAST(LGMAX as CHAR) ," ; ");
            UNTIL fin END REPEAT;
        CLOSE c2;
        SELECT total;  -- AccueilMySQLPHPPHP
    END
    Mon souci est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(LENGTH(ColonneTEXT)) INTO LGMAX FROM `MaTable`;
    renvoie la longueur du nom de la colonne contenu dans ColonneTEXT .
    Ainsi, si le curseur a accroché la colonne TOTO, l'instruction donne 4 alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(LENGTH(TOTO))  FROM `MaTable`;
    va donner (par ex) 1104.

    Comment s'en sortir ?

    Merci par avance.

  2. #2
    Membre chevronné Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Par défaut
    Bonjour qi130 (!!),

    Effectivement MAX(LENGTH(ColonneTEXT)) renvoie la longueur d'une variable qui contient le nom d'une colonne. La longueur du nom de colonne 'TOTO' est bien 4.
    Au passage, je vous recommande d'utiliser CHAR_LENGTH() et non LENGTH(). (Voir doc MySQL pour plus de précision).

    Pour solutionner le problème, il va falloir créer dynamiquement la requête à coup de PREPARE, EXECUTE, DEALLOCATE PREPARE...

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/08/2007, 11h02
  2. Réponses: 1
    Dernier message: 06/03/2007, 11h57
  3. Réponses: 1
    Dernier message: 20/07/2006, 17h03
  4. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  5. Problème Alter view dans une procédure stockée
    Par adjava dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2005, 17h45

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