在存储过程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