具有局部变量的动态 MySQL

Posted

技术标签:

【中文标题】具有局部变量的动态 MySQL【英文标题】:Dynamic MySQL with local variables 【发布时间】:2010-12-01 02:10:15 【问题描述】:

如何在 mysql 数据库中使用动态 SQL 语句而不使用会话变量?

现在我有这样一个代码(在 MySQL 存储过程中):

(...) 声明表名 VARCHAR(32); SET @SelectedId = NULL; SET @s := CONCAT("SELECT Id INTO @SelectedId FROM ", TableName, " WHERE param=val LIMIT 1"); 从@s准备stmt; 执行语句; DEALLOCATE PREPARE stmt; IF ISNULL(@SelectedId) THEN (...)

但我只想使用局部变量,这意味着我想以以下方式开始此过程:

DECLARE 表名 VARCHAR(32);
声明的 VARCHAR(1024);
DECLARE SelectedId INTEGER UNSIGNED;
(...)

并且不要在任何地方使用@char。有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

抱歉,MySQL 中的预处理语句是会话全局的。根据http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html,“准备好的语句对于会话也是全局的。”

在 MySQL 5.x 中没有其他方法(除了准备好的语句)来执行动态 SQL。

所以你当然可以替换上面的“@s”,但是 AFAIK 你被 @SelectedId 卡住了。

在 MySQL 6.x 中,计划了一项功能,该功能将添加一个“EXECUTE IMMEDIATE”语句,该语句将执行动态 SQL。见http://forge.mysql.com/worklog/task.php?id=2793。

【讨论】:

【参考方案2】:

上面的链接给出了一个找不到的页面。请参阅此处: https://dev.mysql.com/doc/refman/5.7/en/prepare.html

最后一段明确指出:

" 在存储程序上下文中准备的语句不能引用存储过程或函数参数或局部变量,因为它们在程序结束时超出范围,并且如果稍后在程序之外执行该语句将不可用。作为一种解决方法,请参考用户定义的变量,这些变量也具有会话范围; "

【讨论】:

以上是关于具有局部变量的动态 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在MYSQL用户定义函数中通过另一个字符串变量引用一个局部变量名?

变量的生存期和存储分配

mysql补充:局部变量

mysql 变量设置问题

静态存储变量STATIC有啥用举个例吧,好像和全局变量还有些联系啊

怎样设置MYSQL局部变量