我的表和行如下表
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中动态构建查询
感谢您的帮助
答案 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
。)