2017-04-26 12 views
0

私は以下のクエリを持っています。クエリを準備せずにストアドプロシージャで実行したいのです。テーブル名として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

あなたが準備しなければならない文字列。 – 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

あなたはAからの結果を返すために必要がある場合ストアドプロシージャは、準備する必要が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

私はまた、結果セットを取得することに興味があります。おそらく、INTやVARCHARのようないくつかのOUTパラメータと組み合わされている可能性があります。 –

関連する問題