在存储过程MySQL中创建动态查询

在存储过程MySQL中创建动态查询,mysql,stored-procedures,mysql-error-1064,Mysql,Stored Procedures,Mysql Error 1064,我有一个表格和表格中的行,如下所示 CREATE TABLE Areas(AreaName VARCHAR(255), PinCode VARCHAR(255)) INSERT INTO Areas(AreaName, PinCode) VALUES('Teynampet', '6000018'), ('Ramapuram', '6000089'), ('TNagar', '6000017')

我有一个表格和表格中的行,如下所示

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')
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 
我编写了一个SQL过程,如下所示

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')
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 
当我调用程序时

CALL mp_test('Teynampet');
当我执行时,我没有得到期望的结果,即600018

如何在SP中动态生成查询


感谢您的帮助

您正在将
pArea
参数连接到SQL unquoted中。也就是说,您准备执行的
@Query
的内容是:

SELECT PinCode FROM Areas WHERE AreaName = Teynampet
由于
Teynampet
是不带引号的,因此它被解析为(n未知)SQL标识符,而不是字符串。你应该:

  • 在SQL中引用它:

    SET @City  = CONCAT(' WHERE AreaName = ', QUOTE(pArea));
    
  • 将其作为参数传递给准备好的语句:

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

    EXECUTE stmt USING @param;
    
但是,为什么在这里使用准备好的语句?您的过程可以重写为一个简单的
SELECT
(这就提出了是否需要使用存储过程的问题):


(请注意,我建议您使用
NULL
而不是空字符串
'
,在这种情况下,上述测试将是
pArea为NULL或pArea=AreaName
)。

感谢您的回复,我将使用NULL