2017-04-26 79 views
0

我希望在存儲過程中執行以下查詢而無需準備查詢,因爲這會給OUT傳遞參數帶來問題。作爲表名連接的MySQL存儲過程變量

DELIMITER // 
CREATE PROCEDURE Test (
    IN CID BIGINT(20), 
    IN IDs LONGTEXT 
    ) 
BEGIN 
    #EXECUTE UNDERNEATH QUERY 
    SELECT * FROM CONCAT('Part1_OfTableName', CID); #CID IS CustomerID 
    END // 
DELIMITER ; 

但是,這失敗了,我不知道如何解決這個問題。

如果您需要返回從結果(請注意,在例子中,我有我的表名沒有空格,但在我的情況我會在我的表名的空間雖然)

+0

你不能沒有從構造查詢動態變化的表名一個字符串...你必須要PREPARE。 – Uueerdo

+0

@Uueerdo我現在有,但這使得我的OUT參數無法檢索...(返回我的錯誤:**不同步**) –

+0

由於@Uueerdo提到你不能這樣做。所有標識符(表,列名等)在MySql中都是靜態的。你指的是什麼'OUT'參數?您提供的代碼不包含任何代碼。 – peterm

回答

2

PREPARE應該有你的能力沒有影響到成功設置好程序的OUT參數

SET DELIMITER // 
CREATE PROCEDURE test(IN cid INT, IN ids TEXT, OUT out_int INT) 
BEGIN 
    SET @sql = CONCAT('SELECT * FROM `table_', cid, '`', CASE WHEN ids IS NULL THEN '' ELSE CONCAT(' WHERE id IN(', ids, ')') END); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    SET out_int = 1; 
END// 
SET DELIMITER ; 

使用範例:

 
mysql> CALL test(1, '2,3', @out_int); 
+------+ 
| id | 
+------+ 
| 2 | 
| 3 | 
+------+ 
2 rows in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @out_int; 
+----------+ 
| @out_int | 
+----------+ 
|  1 | 
+----------+ 
1 row in set (0.00 sec) 
+0

感謝這工作如預期! –

1

存儲過程使用必須準備的sql語句,可以使用中間臨時表。

BEGIN 

CREATE TEMPORARY TABLE `myresults` blah blah....; 
//construct and prepare select you would've used, but start it with an insert like so... 
// INSERT INTO `myresults` SELECT .... 

// Execute the prepared query 
SELECT * FROM `myresults`; 
DROP TEMPORARY TABLE `myresults`; 
END 

......至少我敢肯定,此技術用於工作;在過去的幾年裏,我一直在MSSQL工作。

一些需要注意:如果查詢的連接/會話先前執行

  • 臨時表連接/會話特定的,因此,儘管從全球範圍來看安全使用通用名稱,如myresults可能會出現問題(或通過調用這個程序的過程)使用相同的名稱;在實踐中/偏執狂中,我傾向於使用不同的guid(在使用這種技術的每個過程中)作爲其中生成的任何臨時表的前綴。
+0

太好了,所以這會讓我仍然可以使用我的OUT參數?我會試一試 –

+0

在你的例子中我沒有看到任何OUT參數;我假設你在談論結果集。 – Uueerdo

+0

我也有興趣獲得結果集。最有可能與某些OUT參數結合使用,例如INT和VARCHAR的 –