Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Criando consulta dinâmica no procedimento armazenado MySQL


Você está concatenando o pArea parâmetro no SQL sem aspas. Ou seja, o conteúdo de @Query que você prepara para execução é:
SELECT PinCode FROM Areas WHERE AreaName = Teynampet

Desde Teynampet não está entre aspas, ele é analisado como um identificador SQL (n desconhecido) em vez de uma string. Você deve:

  • cite-o em seu SQL:
    SET @City  = CONCAT(' WHERE AreaName = ', QUOTE(pArea));
    

  • passe-o para a instrução preparada como um parâmetro:
    SET @City  = CONCAT(' WHERE AreaName = ?');
    SET @param = pArea;
    

    e depois:
    EXECUTE stmt USING @param;
    

No entanto, por que usar declarações preparadas aqui? Seu procedimento pode ser reescrito como um simples SELECT (o que levanta a questão de saber se você precisa usar um procedimento armazenado):
CREATE PROCEDURE mp_test(IN pArea VARCHAR(255))
  SELECT PinCode FROM Areas WHERE pArea IN (AreaName, '');

(Observe que eu recomendo que você use NULL em vez da string vazia '' , caso em que o teste acima seria pArea IS NULL OR pArea = AreaName ).