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 retour de donnée dans une procédure stockée [MySQL-5.7]


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 708
    Points : 956
    Points
    956
    Par défaut Problème de retour de donnée dans une procédure stockée
    Bonjour à tous

    J'ai depuis ce matin fait un tour dans le PLSQL de mysql, Voici ce que j'ai tenté de faire :
    1- Sélection d'un certain de nombre de codecompte dans ma table moncompte
    2- Pour chaque codecompte faire un certain traitement.

    Donc pour la partie 1: Pour avoir la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DELIMITER $$
    CREATE PROCEDURE `CONTROLE_GROUP_COMPTE`(IN `LibExercice` VARCHAR(20), OUT `LibCompte` VARCHAR(20))
    BEGIN
        SELECT MONCOMPTE.CODECOMPTE INTO LibCompte
        FROM MONCOMPTE
        WHERE (MONCOMPTE.CODECOMPTE NOT LIKE '%/%') 
        AND (MONCOMPTE.BUGENCOURS ='Prise') 
        AND (MONCOMPTE.NATURECOMPTE = 'Depenses') 
        AND (MONCOMPTE.TITRECOMPTE = 'Rouge') 
        AND (MONCOMPTE.EXERCICECOMPTE = LibExercice);                               
    END$$
    DELIMITER ;
    Mais a cet stade voici l'erreur que j'ai :
    MySql a répondu :#1172 - Le résultat contient plus d'un enregistrement
    c'est normal qu'il y ai plusieurs enregistrement ! Donc je pense que je dois faire une boucle, mais je sais pas comment faire avec le PLSQL de Mysql.

    Merci de m'aider !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 708
    Points : 956
    Points
    956
    Par défaut
    Au niveau de FIREBIRD on a la syntaxe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FOR SELECT .......//ce code ici permet de parcourir plusieurs lignes
                FROM ......
                WHERE ........
                INTO :......
                DO
              BEGIN
            /*traitement*/
             END
    c'est cette syntaxe que je veux reproduire au niveau de Mysql !

    Merci

  3. #3
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 708
    Points : 956
    Points
    956
    Par défaut
    Je viens d'essaiyer ce code mais toujours une erreur de syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BEGIN
        FOR SELECT MONCOMPTE.CODECOMPTE INTO LibCompte 
        FROM MONCOMPTE
        WHERE (MONCOMPTE.CODECOMPTE NOT LIKE '%/%') 
        AND (MONCOMPTE.BUGENCOURS ='Prise') 
        AND (MONCOMPTE.NATURECOMPTE = 'Depenses') 
        AND (MONCOMPTE.TITRECOMPTE = 'Rouge') 
        AND (MONCOMPTE.EXERCICECOMPTE = LibExercice)  
        DO 
    /*traitement*/                            
        END FOR;
    END

  4. #4
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 708
    Points : 956
    Points
    956
    Par défaut
    Bonjour
    @Artemus24, tu pourrai m'aider sur ce coup ? je suis coincé la !
    Merci à tous

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 483
    Points : 19 503
    Points
    19 503
    Par défaut
    Salut devalender.

    Autre environnement, autre façon de raisonner.
    En MySql, on utilise le "cursor" pour extraire les lignes dont on a besoin, puis par un "fetch", lire chaque ligne une par une.

    Voici un exemple d'un script source :
    Code mysql : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    START TRANSACTION;
     
    -- ======================
    -- Base de Données `base`
    -- ======================
     
    DROP DATABASE IF EXISTS `base`;
     
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`;
     
    use `base`;
     
    -- ==================
    -- Procedure `verify`
    -- ==================
     
    DROP PROCEDURE IF EXISTS `verify`;
     
    DELIMITER $$
    CREATE PROCEDURE `verify` (  in_database   varchar(255))
    DETERMINISTIC
    NO SQL
    BEGIN
      DECLARE _tab   VARCHAR(255);
      DECLARE _col   VARCHAR(255);
      DECLARE _line  VARCHAR(255);
      DECLARE _fin   INTEGER  DEFAULT 1;
     
      DECLARE _curs  CURSOR FOR SELECT table_name, column_name from information_schema.columns
                     where table_schema = in_database and data_type in ('char','varchar','text','mediumtext','longtext');
     
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
      OPEN  _curs;
      FETCH _curs INTO _tab, _col;
     
      WHILE (_fin)
      DO
        SET _line = concat('select ', _col, ' from ', in_database, '.', _tab, ' where locate(\'alphabetic\', ', _col, ') <> 0;');
     
        SELECT _line as Requête;
     
        SET @req  = _line;
        PREPARE            stmt FROM @req;
        EXECUTE            stmt;
        DEALLOCATE PREPARE stmt;
     
        FETCH _curs INTO _tab, _col;
      END WHILE;
     
      CLOSE _curs;
    END$$
    DELIMITER ;
     
    -- =====================
    -- Exécuter la procédure
    -- =====================
     
    call `verify` ('mysql');
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    EXIT
    Je pense que cet exemple est assez complet.
    Dans le "cursor", tu vas mettre ton select.
    Juste après le "do", tu vas introduire ce que tu désires faire pour une ligne donnée.
    Je suppose qu'il y aura des tests au préalable.

    Ici dans mon exemple, c'est une mise en forme, dont le but est de rechercher la présence de la chaîne de caractères "alphabetic" dans une colonne de type chaîne de caractères.

    J'exécute ce select dynamiquement, puis à fin de boucle, je lis (fetch) la ligne suivante.

    @+

  6. #6
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 708
    Points : 956
    Points
    956
    Par défaut
    Bonjour
    Merci beaucoup je brasse tout ça et je vous fais un retour !

  7. #7
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 708
    Points : 956
    Points
    956
    Par défaut
    Voici la requête modifiée a partir de la tienne :

    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
    29
    30
    31
    32
    33
    34
     
    DELIMITER $$
    CREATE PROCEDURE `CONTROLE_GROUP_COMPTE` ( IN `LibExercice` varchar(255), OUT `LibCompte` VARCHAR(255))
    DETERMINISTIC
    NO SQL
    BEGIN
     
    DECLARE _fin   INTEGER  DEFAULT 1;
     
    DECLARE _curs CURSOR 
    FOR SELECT MONCOMPTE.CODECOMPTE
    FROM MONCOMPTE
    WHERE (MONCOMPTE.CODECOMPTE NOT LIKE '%/%') 
    AND (MONCOMPTE.BUGENCOURS ='Prise') 
    AND (MONCOMPTE.NATURECOMPTE = 'Depenses') 
    AND (MONCOMPTE.TITRECOMPTE = 'Rouge') 
    AND (MONCOMPTE.EXERCICECOMPTE = LibExercice);
     
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
    OPEN  _curs;
    FETCH _curs INTO LibCompte;
     
    WHILE (_fin)
    DO
    /*Mon traitement*/
    /*Affiche tous les LibCompte*/  
     
    FETCH _curs INTO LibCompte;
    END WHILE;
     
    CLOSE _curs;
    END$$
    DELIMITER ;
    Au niveau de la compilation parfait, pas d'erreur, mais à l'exécution par contre j'ai un soucis ! je croyais voir afficher la liste de tous les MONCOMPTE.CODECOMPTE
    mais dans mon cas je n'ai qu'une seule valeur affichée (la dernière peut être), ai-je rater un truc ?

    Merci

  8. #8
    Membre éprouvé
    Homme Profil pro
    Benevole
    Inscrit en
    Mai 2004
    Messages
    1 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Benevole
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 708
    Points : 956
    Points
    956
    Par défaut
    Je pense avoir trouver il manquait le Select dans la boucle.
    Merci Artemus24

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/11/2014, 10h47
  2. Réponses: 2
    Dernier message: 30/10/2008, 16h29
  3. Problème de longueur de requête dans une procédure stockée
    Par doudou_rennes dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/03/2007, 16h39
  4. Saisie de données dans une procédure stockée
    Par Hastaroth dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/10/2004, 09h54
  5. Vérification du type de données dans une procédure stockée
    Par biroule dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/09/2004, 11h20

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