1

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

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

谢谢您的帮助

4

1 回答 1

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)。

于 2012-08-29T09:25:17.557 回答