mysql存储过程中参数中的同一变量

mysql存储过程中参数中的同一变量,mysql,optimization,Mysql,Optimization,如何缓存存储过程中的动态查询? 现在,我创建了如下存储过程: CREATE PROCEDURE usp_MyProcedure ( IN UserID INT, .... ) BEGIN SET @sqlQuery = CONCAT("SELECT Name From Users WHERE UserID > ", UserID, " AND UserID IN ( SELECT UserID FROM OtherTable WHERE UserID = ", User

如何缓存存储过程中的动态查询? 现在,我创建了如下存储过程:

CREATE PROCEDURE usp_MyProcedure (
  IN UserID INT,
  .... 
)
BEGIN

   SET @sqlQuery = CONCAT("SELECT Name From Users WHERE UserID > ", UserID, " AND UserID  IN ( SELECT UserID FROM OtherTable WHERE UserID = ", UserID, " ) Order by Name") 

   PREPARE stmt FROM @sqlQuery;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;

END;
但是这种查询不会缓存。所以,每次它都有更多的时间来执行/处理查询

现在我尝试了其他类似的方法:

CREATE PROCEDURE usp_MyProcedure (
  IN UserID INT,
  .... 
)
BEGIN
   SET @UserID = UserID;

   SET @sqlQuery = "SELECT Name From Users WHERE UserID > ? AND UserID  IN ( SELECT UserID FROM OtherTable WHERE UserID = ? ) Order by Name";

   PREPARE stmt FROM @sqlQuery;
   EXECUTE stmt @UserID, @UserID; -- here i passed same variable twice.
   DEALLOCATE PREPARE stmt;
END;
在上面的例子中,我必须传递同一个变量(@UserID)两次,因为它在我的查询中被使用了两次。但这项工作在长时间或复杂的查询中非常繁忙。那么,我如何避免这种情况呢

我尝试的另一种方法如下:

CREATE PROCEDURE usp_MyProcedure (
  IN UserID INT,
  .... 
)
BEGIN
   SET @UserID = UserID;

   SET @sqlQuery = "SELECT Name From Users WHERE UserID > @UserID AND UserID  IN ( SELECT UserID FROM OtherTable WHERE UserID = @UserID ) Order by Name";

   PREPARE stmt FROM @sqlQuery;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;
END;
但上面的查询再次没有缓存。所以执行时间很长。并且这种声明为会话全局变量的变量可能与另一个存储过程的变量冲突。因为我在这个存储过程中有调用存储过程,而在另一个存储过程中变量名应该是相同的

所以,让我知道什么是最好的解决方案相同


谢谢。

对不起,刚刚发错了一条

DELIMITER //
CREATE PROCEDURE yourprocedurenamehere(IN state CHAR(2))
BEGIN
SET @mystate = state;
SET @sql = CONCAT('SELECT * FROM BLABLABLA WHERE BLA = ?');
PREPARE stmt FROM @sql;
EXECUTE stmt USING @mystate;
END;
//

对不起,朋友,刚刚编辑了我的代码,哈哈哈,我搞错了。简短的回答是没有办法。理论上,您可以使用sha1(准备语句查询文本)标识准备语句名称,并将其用作语句句柄。但无法动态执行名称存储在变量或表中的语句:动态SQL查询文本中不允许执行本身。
另一个问题是,在您的示例中是否需要动态SQL,似乎用输入参数参数化的标准SQL存储过程就可以了。

重新标记这个问题,因为它与MySQL Workbench无关,只是一个纯粹的MySQL优化问题。感谢mike lischke重新标记javalovers,谢谢你的回复。但我不明白你的答案。我想在ExecuteJavaOvers中传递每个参数一次,但我不明白您的意思。