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

时间:2012-08-29 08:59:35

标签: 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'), 
            ('Mylapore', '6000014'), 
            ('Gopalapuram', '6000087')

我在下面写了一个SQL过程

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中动态构建查询

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

您将pArea参数连接到SQL未加引号。也就是说,您准备执行的@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(这引发了您是否需要使用存储过程的问题):

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

(请注意,我建议您使用NULL代替空字符'',在这种情况下,上述测试将为pArea IS NULL OR pArea = AreaName。)