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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 )

+ 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