如何在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。有没有办法做到这一点?
答案 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。