简体   繁体   English

带有局部变量的动态 MySQL

[英]Dynamic MySQL with local variables

How can I use dynamic SQL statements in MySQL database and without using session variables?如何在不使用会话变量的情况下在 MySQL 数据库中使用动态 SQL 语句?

Right now I have such a code (in MySQL stored procedure):现在我有这样的代码(在 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 
(...)

But I'd like to use only local variables, that means I'd like to start this procedure with:但我只想使用局部变量,这意味着我想用以下方式开始这个过程:

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

and do not use @ char anywhere.并且不要在任何地方使用@char。 Is there any way to do this?有没有办法做到这一点?

Sorry, prepared statements in MySQL are session-global. 对不起,MySQL中的预处理语句是会话全局的。 According to http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html , "A prepared statement is also global to the session." 根据http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html ,“准备好的声明也是会话的全局声明。”

And there's no other way (besides prepared statements) to execute dynamic SQL in MySQL 5.x. 并且没有其他方法(除了预备语句)在MySQL 5.x中执行动态SQL。

So you can of course replace "@s" above, but AFAIK you're stuck with @SelectedId. 所以你当然可以替换上面的“@s”,但AFAIK你会被@SelectedId所困。

In MySQL 6.x, there is a feature planned which will add an "EXECUTE IMMEDIATE" statement which will execute dynamic SQL. 在MySQL 6.x中,计划的功能将添加一个“EXECUTE IMMEDIATE”语句,该语句将执行动态SQL。 See http://forge.mysql.com/worklog/task.php?id=2793 . 请参见http://forge.mysql.com/worklog/task.php?id=2793

The link above gives a page not found.上面的链接给出了一个找不到的页面。 See here instead : https://dev.mysql.com/doc/refman/5.7/en/prepare.html请参阅此处: https : //dev.mysql.com/doc/refman/5.7/en/prepare.html

The end para clearly states :最后一段明确指出:

" A statement prepared in stored program context cannot refer to stored procedure or function parameters or local variables because they go out of scope when the program ends and would be unavailable were the statement to be executed later outside the program. As a workaround, refer instead to user-defined variables, which also have session scope; " " 在存储程序上下文中准备的语句不能引用存储过程或函数参数或局部变量,因为它们在程序结束时超出范围并且如果稍后在程序外执行该语句将不可用。作为一种解决方法,请改为参考到用户定义的变量,也有会话范围;"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM