2017-03-04 110 views
0

中設置了動態查詢我嘗試在存儲過程內向另一個數據庫(同一服務器)進行一個查詢。 一切正常,但我需要使用從參數中收到的dinamic數據庫名稱。MySQL存儲過程在參數

CREATE PROCEDURE my_sp(
IN in_db_name VARCHAR(32), 
OUT out_result VARCHAR(32) 
) 
BEGIN 
    /*This working OK*/ 
    SELECT my_col INTO out_result FROM another_db.my_table WHERE id = 1; 

    /*This NOT WORK :(*/ 
    SELECT my_col INTO out_result FROM @in_db_name.my_table WHERE id = 1; 
END; 
+1

不能在報表編制更改表名,只有參數值。準備語句是數據庫準備(解釋)預先執行此查詢的計劃的準備工作,並使用此準備好的計劃以不同參數執行查詢。如果更改表名,那麼對於數據庫和數據庫系統來說,這是完全不同的執行計劃,必須重新從頭開始重新計算執行計劃。這不是事先準備的要點。 – sbrbot

回答

0

您需要爲此使用動態查詢。

CREATE PROCEDURE my_sp(
IN in_db_name VARCHAR(32), 
OUT out_result VARCHAR(32) 
) 
SET @s = (concat ("SELECT my_col INTO out_result FROM " , in_db_name.my_table , " WHERE id = 1;" 
    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END 
+0

你的答案似乎在邏輯上是正確的,但不起作用。我已經聲明@s varchar(255)...我已經添加了兩個右括號,這是缺少))。 - >(concat(「SELECT my_col INTO out_result FROM」,in_db_name.my_table,「WHERE id = 1;」))。我也嘗試過:...,in_db_name,「.my_table ...」。但不工作 – MTK

0

嘗試:

DELIMITER // 

CREATE PROCEDURE `my_sp` (
    IN `in_db_name` VARCHAR(32), 
    OUT `out_result` VARCHAR(32) 
) 
BEGIN 
    SET @`query` := CONCAT('SELECT `my_col` INTO @`_out_result` 
          FROM `', `in_db_name`, '`.`my_table` 
          WHERE `id` = 1'); 
    PREPARE `stmt` FROM @`query`; 
    EXECUTE `stmt`; 
    SET `out_result` := @`_out_result`; 
    DEALLOCATE PREPARE `stmt`; 
END// 

DELIMITER ; 

14.5 Prepared SQL Statement Syntax

例子:

mysql> DROP TABLE IF EXISTS `my_table`; 
Query OK, 0 rows affected, 1 warning (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `my_table` (
    ->  `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    ->  `my_col` VARCHAR(32) NOT NULL 
    ->); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO `my_table` (`my_col`) 
    -> VALUES ('ONE'); 
Query OK, 1 row affected (0.00 sec) 

mysql> DELIMITER // 

mysql> CREATE PROCEDURE `my_sp` (
    ->  IN `in_db_name` VARCHAR(32), 
    ->  OUT `out_result` VARCHAR(32) 
    ->) 
    -> BEGIN 
    ->  SET @`query` := CONCAT('SELECT `my_col` INTO @`_out_result` 
    '>        FROM `', `in_db_name`, '`.`my_table` 
    '>        WHERE `id` = 1'); 
    ->  PREPARE `stmt` FROM @`query`; 
    ->  EXECUTE `stmt`; 
    ->  SET `out_result` := @`_out_result`; 
    ->  DEALLOCATE PREPARE `stmt`; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> DELIMITER ; 

mysql> CALL `my_sp`('test', @`my_out_result`); 
Query OK, 0 rows affected (0.00 sec) 

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

不起作用。爲了測試,我決定使用原始查詢中的concat(不帶參數)。concat(「SELECT my_col INTO out_result FROM」,「another_db.my_table」,「WHERE id = 1;」)... < - 所以我有連接mi第一個工作查詢...和NOT WORK .... so準備好的東西出了問題 – MTK

+0

@MTK:請參閱答案中的示例。 – wchiquito

+0

謝謝你的時間。仍然沒有工作。我看到你的例子,我相信你的電腦工作。我不知道爲什麼,但例如在í情況下,如果我不聲明@query變量我得到錯誤(在你的情況下不)。我嘗試了一步一步,然後Evrithing Ok,直到我寫下這一行「PREPARE'stmt' FROM @'query';」 ....需要stmt被宣佈(什麼類型?)。我無法在mysql手冊中找到它(他們也說你喜歡你設置變量=值...但在mi情況下,如果我沒有聲明此變量有錯誤...我很困惑) – MTK