动态MySQL与局部变量

时间:2009-09-24 13:06:18

标签: mysql dynamic prepared-statement session-variables local-variables

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

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

(...)
DECLARE TableName VARCHAR(32);
SET @SelectedId = NULL;
SET @s := CONCAT("SELECT Id INTO @SelectedId FROM ", TableName, " WHERE param=val LIMIT 1");
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF ISNULL(@SelectedId) THEN 
(...)

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

DECLARE TableName VARCHAR(32);
DECLARE s VARCHAR(1024);
DECLARE SelectedId INTEGER UNSIGNED;
(...)

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

1 个答案:

答案 0 :(得分:2)

抱歉,MySQL中的预备语句是会话全局的。根据{{​​3}},“准备好的声明对会议来说也是全球性的。”

除了准备好的语句之外,没有其他方法可以在MySQL 5.x中执行动态SQL。

所以你当然可以替换上面的“@s”,但AFAIK你会被@SelectedId所困。

在MySQL 6.x中,有一个功能计划将添加一个“EXECUTE IMMEDIATE”语句,该语句将执行动态SQL。请参阅http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html