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

时间:2013-05-03 08:30:07

标签: 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 = ", 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),因为它在我的查询中使用了2次。但是这项工作在长期或复杂的查询中非常繁忙。那么,我该如何避免这种情况呢?

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

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;

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

所以,让我知道同样的最佳解决方案。

感谢。

2 个答案:

答案 0 :(得分:0)

抱歉刚发布了一个错误的

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;
//

对不起朋友,刚刚编辑了我的代码哈哈哈我弄错了

答案 1 :(得分:0)

简短的回答是没有办法做到这一点。理论上,您可以使用sha1(预准备语句查询文本)识别预准备语句名称,并将其用作语句句柄。但是没有办法动态执行一个名称存储在变量或表中的语句:动态SQL查询文本中不允许执行EXECUTE。 另一个问题是你的示例中是否需要动态SQL,看起来像参数化输入参数的标准SQL存储过程可以做得很好。