0

ストア プロシージャから動的クエリをキャッシュするにはどうすればよいですか? 今、次のようなストア プロシージャを作成しました。

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;

上記の場合、クエリで 2 回使用されるため、同じ変数 (@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;

しかし、上記のクエリはキャッシュされません。そのため、実行時間が非常に長くなります。また、セッション グローバル変数として宣言されたこのタイプの変数は、別のストア プロシージャの変数と競合する可能性があります。このストア プロシージャ内にストア プロシージャを呼び出しており、変数名は別のストア プロシージャでも同じにする必要があるためです。

それで、同じことに対する最善の解決策を教えてください。

ありがとう。

4

2 に答える 2

0

Sorry just posted a mistaken one,

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

Sorry pal, just edited my code hahaha I got this wrong

于 2013-05-03T08:54:19.287 に答える