2012-08-29 7 views
1

J'ai une table et des lignes dans le tableau comme ci-dessousCréation dynamique de requête dans la procédure stockée MySQL

CREATE TABLE Areas(AreaName VARCHAR(255), 
        PinCode VARCHAR(255)) 

INSERT INTO Areas(AreaName, PinCode) 
     VALUES('Teynampet', '6000018'), 
      ('Ramapuram', '6000089'), 
      ('TNagar', '6000017'), 
      ('Mylapore', '6000014'), 
      ('Gopalapuram', '6000087') 

I Wrote une procédure SQL comme ci-dessous

DROP PROCEDURE IF EXISTS mp_test; 
CREATE PROCEDURE mp_test(IN pArea VARCHAR(255)) 
    BEGIN 
     SET @Query = 'SELECT PinCode FROM Areas'; 

     IF pArea != '' 
     THEN 
     SET @City = CONCAT(' WHERE AreaName = ', pArea); 
     END IF; 

     SET @Query = CONCAT(@Query, @City); 

PREPARE stmt FROM @Query; 
EXECUTE stmt; 
END 

Lorsque j'appelle la Procédure

CALL mp_test('Teynampet'); 

Quand je ne suis pas i exécutons obtenir le résultat souhaité est-à-dire 600018

Comment puis-je construire requête dynamique dans SP

Merci pour l'aide

Répondre

2

Vous concaténer le paramètre pArea dans le SQL non cité Autrement dit, le contenu de @Query que vous préparez pour l'exécution est:

SELECT PinCode FROM Areas WHERE AreaName = Teynampet 

Depuis Teynampet est non cotée, elle est analysée comme (n inconnu) identifiant SQL plutôt qu'une chaîne. Vous devez soit:

  • citation dans votre SQL:

    SET @City = CONCAT(' WHERE AreaName = ', QUOTE(pArea)); 
    
  • passe à la déclaration préparée comme paramètre:

    SET @City = CONCAT(' WHERE AreaName = ?'); 
    SET @param = pArea; 
    

    puis:

    EXECUTE stmt USING @param; 
    

Cependant, pourquoi utiliser des instructions préparées ici? Votre procédure peut être réécrite comme SELECT simple (ce qui pose la question de savoir si vous avez besoin d'utiliser une procédure stockée à tous):

CREATE PROCEDURE mp_test(IN pArea VARCHAR(255)) 
    SELECT PinCode FROM Areas WHERE pArea IN (AreaName, ''); 

(Notez que je vous recommande d'utiliser NULL au lieu de la chaîne vide '' auquel cas le test ci-dessus serait pArea IS NULL OR pArea = AreaName).

+0

Merci de répondre, je vais utiliser Null – user1093513

Questions connexes