我正在存储过程中创建一个动态查询。我的存储过程如下:
CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team=",w_team);
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END
当我尝试通过以下调用运行它时:
call test1 ('Test','SPA');
我收到以下错误消息:
Error Code: 1054. Unknown column 'SPA' in 'where clause'
我在没有 where 条件的情况下进行了测试,它工作正常,但是在 where 条件下它不起作用,我尝试使用 @ 和变量名,但它仍然不起作用。
感谢您的帮助。
最佳答案
Error Code: 1054. Unknown column 'SPA' in 'where clause'
当您没有将输入字符串括在引号中时,SQL 引擎会尝试将其识别为正在查询的表中的列,就会发生这种情况。但它失败了,因为找不到它。
但是当它找到这样的列时会发生什么?
当它在列值上找到一些匹配项时,它会获取结果。
显然这不是人们所期待的。
如何克服这个问题?将准备好的语句与动态输入值一起使用。
您也可以在存储过程中对动态输入值使用 ?
等占位符,以与 Prepared Statements
一起使用。当分配给 SQL 表达式或在 SQL 表达式中进行比较时,引擎将处理转义字符和其他字符串值。
您只需根据需要将过程输入重新分配给一个或多个 session 变量。
程序示例:
CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) )
BEGIN
SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder
SET @w_team := w_team;
PREPARE stmt3 FROM @t1;
EXECUTE stmt3 USING @w_team; -- <-- input for placeholder
DEALLOCATE PREPARE stmt3;
END;
关于存储过程中的mysql动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23178816/