存储过程中的mysql动态查询

标签 mysql sql stored-procedures

我正在存储过程中创建一个动态查询。我的存储过程如下:

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/

相关文章:

MYSQL <> 运算符代替 NOT IN

MySQL 连接和空值

java - 使用 native 查询的 JPA 查询返回 null 而不是实体列表

SQL在查询结果中输出行号

c# - 如何在 C# 中调用带有对象参数的 Oracle 存储过程作为输入?

mysql - 如何在 MySQL 程序中创建唯一的临时表?

c# - 提高 C# 中 SQL SELECT 的性能

mysql - 插入 SQL 错误

sql - 如何在 PostgreSQL 中将可变小时数添加到日期?

MySQL - 使用存储过程设置用户密码