3

如何在 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
(...)

但我只想使用局部变量,这意味着我想开始这个过程:

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

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

4

2 回答 2

2

抱歉,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

于 2009-09-25T15:54:39.253 回答
0

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

结尾段明确指出:

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

于 2022-01-07T10:43:59.780 回答