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 :

IF, dans la requete, dans une procédure stockée


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut IF, dans la requete, dans une procédure stockée
    Bonjour,

    J'aimerai savoir comment faire pour faire un IF dans une procédure stockée. Cela me parait en même temps facile, et pourtant j'ai une erreur :
    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
    If param_id_category = 0 THEN
         SELECT
    	  `CATEGORY`.`CAT_NAME`,
    	  `PORTFOLIO_LANG`.`PORT_TITLE`,
    	  `PORTFOLIO_LANG`.`PORT_ID`
    	FROM
    	  `PORTFOLIO` p
    	  INNER JOIN `PORTFOLIO_LANG` ON (`p`.`PORT_ID` = `PORTFOLIO_LANG`.`PORT_ID`)
    	  INNER JOIN `CATEGORY` ON (`p`.`PORT_CATEGORY_ID` = `CATEGORY`.`CAT_ID`)
    	WHERE
    	  `CATEGORY`.`CAT_ID` = 1
     
            IF param_limit > 0 THEN
            	LIMIT 0,param_limit
            END IF;
           ;
     
        ELSE
            SELECT
    	  `CATEGORY`.`CAT_NAME`,
    	  `PORTFOLIO_LANG`.`PORT_TITLE`,
    	  `PORTFOLIO_LANG`.`PORT_ID`
    	FROM
    	  `PORTFOLIO` p
    	  INNER JOIN `PORTFOLIO_LANG` ON (`p`.`PORT_ID` = `PORTFOLIO_LANG`.`PORT_ID`)
    	  INNER JOIN `CATEGORY` ON (`p`.`PORT_CATEGORY_ID` = `CATEGORY`.`CAT_ID`)
     
            IF param_limit > 0 THEN
            	LIMIT 0,param_limit
            END IF;
             ;
     
       END IF
    J'ai essayé de faire de plusieurs manières avec un BEGIN - END, etc, mais çà ne change rien.

    D'ailleurs on ne peut pas appliquer ce principe de IF pour ne pas re-écrire toute la requete, comme par 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
    SELECT
    	  `CATEGORY`.`CAT_NAME`,
    	  `PORTFOLIO_LANG`.`PORT_TITLE`,
    	  `PORTFOLIO_LANG`.`PORT_ID`
    	FROM
    	  `PORTFOLIO` p
    	  INNER JOIN `PORTFOLIO_LANG` ON (`p`.`PORT_ID` = `PORTFOLIO_LANG`.`PORT_ID`)
    	  INNER JOIN `CATEGORY` ON (`p`.`PORT_CATEGORY_ID` = `CATEGORY`.`CAT_ID`)
    IF param_id_category = 0 THEN     
    	WHERE
    	  `CATEGORY`.`CAT_ID` = 1
    END IF;
     
    ;
    Merci et bonne journée.
    F.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Essaie comme ça :
    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
    DELIMITER $$
    DROP PROCEDURE IF EXISTS toto$$
     
    CREATE PROCEDURE toto(IN  param_id_category INT, IN param_limit INT ) 
    BEGIN
     
    SET @mySelect:= 'SELECT
    	  `CATEGORY`.`CAT_NAME`,
    	  `PORTFOLIO_LANG`.`PORT_TITLE`,
    	  `PORTFOLIO_LANG`.`PORT_ID`
    	FROM
    	  `PORTFOLIO` p
    	  INNER JOIN `PORTFOLIO_LANG` ON (`p`.`PORT_ID` = `PORTFOLIO_LANG`.`PORT_ID`)
    	  INNER JOIN `CATEGORY` ON (`p`.`PORT_CATEGORY_ID` = `CATEGORY`.`CAT_ID`)';
     
    IF(param_id_category = 0) THEN     
      SET @mySelect:= CONCAT(@mySelect, ' WHERE `CATEGORY`.`CAT_ID` = 1'); 
    END IF;
     
    IF(param_limit>0) THEN
      SET @mySelect:= CONCAT(@mySelect, ' LIMIT 0,',param_limit); 
    END IF;
     
    prepare stmnt from @mySelect; 
    EXECUTE stmnt; 
    DEALLOCATE PREPARE stmnt; 
     
    END$$ 
     
    DELIMITER ;

  3. #3
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    Bonjour,

    çà avait l'air plutot cool , mais j'ai une erreur, lors du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF(param_id_category = 0) THEN     
      SET @mySelect:= CONCAT(@mySelect, ' WHERE `CATEGORY`.`CAT_ID` = 1'); 
    END IF;
    Cà ne passe pas...

    Fabrice

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Citation Envoyé par __fabrice Voir le message
    Bonjour,

    çà avait l'air plutot cool , mais j'ai une erreur, lors du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF(param_id_category = 0) THEN     
      SET @mySelect:= CONCAT(@mySelect, ' WHERE `CATEGORY`.`CAT_ID` = 1'); 
    END IF;
    Cà ne passe pas...

    Fabrice
    Tu as quelle erreur ?
    Si tu post la procédure complète ainsi que le "CREATE TABLE", je ferai un test.

  5. #5
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    J'en ai fait une simplifié du coup :
    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
    --
    -- Structure de la table `CATEGORY`
    --
     
    CREATE TABLE IF NOT EXISTS `CATEGORY` (
      `CAT_ID` int(11) NOT NULL AUTO_INCREMENT,
      `CAT_NAME` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`CAT_ID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
     
    --
    -- Contenu de la table `CATEGORY`
    --
     
    INSERT INTO `CATEGORY` (`CAT_ID`, `CAT_NAME`) VALUES
    (1, 'web'),
    (2, 'design'),
    (3, 'event');
    Donc, ceci ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * FROM CATEGORY
     
    if param_id_category > 0 THEN
    	WHERE CAT_ID=param_id_category
    END IF;
     
    ;
    Et avec ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SET @mySelect:= 'SELECT * FROM CATEGORY ';
     
    IF(param_id_category > 0) THEN
      SET @mySelect:= CONCAT(@mySelect, 'WHERE CAT_ID=',param_id_category); 
    END IF;
     
    prepare stmnt FROM @mySelect; 
    EXECUTE stmnt; 
    DEALLOCATE PREPARE stmnt;
    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
    -- --------------------------------------------------------------------------------
    -- Routine DDL
    -- Note: comments before and after the routine body will not be stored by the server
    -- --------------------------------------------------------------------------------
    DELIMITER $$
     
    CREATE PROCEDURE `qda_attitudedesign`.`routine1` ()
    BEGIN
    SET @mySelect:= 'SELECT * FROM CATEGORY ';
     
    IF(param_id_category > 0) THEN
      SET @mySelect:= CONCAT(@mySelect, 'WHERE CAT_ID=',param_id_category); 
    END IF;
     
    prepare stmnt FROM @mySelect; 
    EXECUTE stmnt; 
    DEALLOCATE PREPARE stmnt;
     
    END$$ 
     
    DELIMITER ;

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Il faut passer param_id_category en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE PROCEDURE `qda_attitudedesign`.`routine1` (IN param_id_category INT )

  7. #7
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    Oui, je sais, mais je bosse avec phpmyadmin (dernière version) et DbNnija (prometteur)

    Le dernier source est avec le Mysql Workbench, que je trouve pas tres pratique, et que je maitrise moins.

    F.

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Citation Envoyé par __fabrice Voir le message
    Oui, je sais, mais je bosse avec phpmyadmin (dernière version) et DbNnija (prometteur)
    Le dernier source est avec le Mysql Workbench, que je trouve pas tres pratique, et que je maitrise moins.
    Désolé, mais je ne comprends pas ce que tu essaies de dire.
    Les procédures ne s'écrivent pas de la même façon en fonction que l'on soit sous workbench ou phpmyadmin ?


    Logiquement, si tu crées ta procédure comme ceci :
    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
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `qda_attitudedesign`.`routine1`$$
    CREATE PROCEDURE `qda_attitudedesign`.`routine1` (IN param_id_category INT)
    BEGIN
    SET @mySelect:= 'SELECT * FROM CATEGORY ';
     
    IF(param_id_category > 0) THEN
      SET @mySelect:= CONCAT(@mySelect, 'WHERE CAT_ID=',param_id_category); 
    END IF;
     
    prepare stmnt FROM @mySelect; 
    EXECUTE stmnt; 
    DEALLOCATE PREPARE stmnt;
     
    END$$ 
     
    DELIMITER ;
    Et que tu la lances comme ceci :
    Tu devrais avoir :
    CAT_ID CAT_NAME
    2 design

  9. #9
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    Ben oui et non, sous le Workbench, il te donne le code en entier avec çà par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `qda_attitudedesign`.`routine1`$$
    CREATE PROCEDURE `qda_attitudedesign`.`routine1` (IN param_id_category INT)
    Avec la derniere version de phpmyadmin, tu as (enfin.....) une interface pour créer des vues et des ps. Tu n'as qu'a écrire le code (voir les PJ).
    Images attachées Images attachées   

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Si ça ne fonctionne pas quand tu la créés avec l'outil de phpmyadmin mais que ça fonctionne lorsque tu l'écris dans workbench, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW CREATE PROCEDURE `qda_attitudedesign`.`routine1`
    pour voir les différences.

    EDIT:
    Je viens de la créer avec PHPMYADMIN et tout a fonctionné...

  11. #11
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    Je viens de la créer avec PHPMYADMIN et tout a fonctionné...
    Ha, c'est étrange alors... Tu as quel code exactement la zone de saisie stp ?

    F.

  12. #12
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Citation Envoyé par __fabrice Voir le message
    Ha, c'est étrange alors... Tu as quel code exactement la zone de saisie stp ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    BEGIN
    SET @mySelect:= 'SELECT * FROM CATEGORY ';
     
    IF(param_id_category > 0) THEN
      SET @mySelect:= CONCAT(@mySelect, 'WHERE CAT_ID=',param_id_category); 
    END IF;
     
    prepare stmnt FROM @mySelect; 
    EXECUTE stmnt; 
    DEALLOCATE PREPARE stmnt;
     
    END
    Il te manque surement le BEGIN/END

  13. #13
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    Super.. çà marche nickel.. Merci

    Je vais tester avec les plus grosses SP

    a+
    Fab

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/06/2011, 12h10
  2. Réponses: 0
    Dernier message: 16/02/2011, 21h24
  3. Réponses: 8
    Dernier message: 06/01/2011, 16h04
  4. Réponses: 7
    Dernier message: 05/03/2009, 15h46
  5. Réponses: 13
    Dernier message: 11/01/2007, 15h39

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