2016-12-28 9 views
1


MySQLで1つのSELECTクエリで複数の変数を設定する方法はありますか?

こんにちは、みなさん。

私のSPには、このようなSELECTクエリがあります。

SELECT val_01, val_02 INTO var_01, var_02 FROM table_name WHERE col_name = condition_01; 

このクエリは正しく動作します。

しかし、SQLWARNINGの終了ハンドラをに追加しました。上記のSELECTクエリで結果が得られない場合、SQL警告がこのようになり、停止しました。

データなし - ゼロ行が選択され、取り出された、または私はGoogleで検索して、この問題を解決する方法を見つけた

を処理しました。このようなクエリを変更しています...

SELECT var_01 = val_01, var_02 = val_02 FROM table_name WHERE col_name = condition_01; 

このクエリが機能します。しかし、元のクエリと変更されたクエリには違いがあります。

SPでは、元のクエリの結果は表示されません。 SELECTクエリの値を変数に代入するだけです。

しかし、後者は変数の値でSELECT結果をスローします。

SPを呼び出す私のcppコードが間違った値を取得します。

私は

SET var_01 = SELECT val_01 FROM table_name WHERE col_name = condition_01; 

SET var_02 = SELECT val_02 FROM table_name WHERE col_name = condition_01; 

...にクエリを変更することができますしかし、あなたが知っているように、これは非常に非効率的であり、クエリの下に動作しません。

SET var_01, var_02 = (SELECT val_01, val_02 FROM table_name WHERE col_name = condition_01); 

元のクエリと同じ結果を得る効率的な方法はありますか?

私を助けてください。ありがとうございました。

+0

この特定のシナリオは、出口ハンドラで処理します(たとえば、最初のクエリでレコードが返されない場合は終了しないでください)。 – Shadow

答えて

1

INTOを参照してください、それはあなたが求めているものを正確には不明だが、あなたは一時的に必要がある場合exitハンドラをオーバーライドし、新しいスコープブロックでクエリをネストし、変数をクリアするハンドラを使用します。 (ループ内であればクリアする必要があり、割り当てられていれば以前の値を保持します)。

-- inside existing procedure 
BEGIN -- add this and the handler 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET var_01 = NULL, var_02 = NULL; 
    SELECT val_01, val_02 INTO var_01, var_02 FROM table_name WHERE col_name = condition_01; 
END; -- add this 
-- procedure continues here 
+1

「一時的に終了ハンドラを無効にする」は、私にとってとても新鮮で便利です。ありがとうございました!! – passion053

0
SET @var_01 = @var_02 = ''; 
SELECT _val_01, _val_02 INTO @var_01, @var_02 FROM table_name WHERE col_name = condition_01; 

// check whether var_01=='' or length==0 then do what you want 
SELECT @var_01, @var_02 
// or 
SELECT LENGTH(@var_01) 
+1

あなたはローカル変数ではないユーザ変数を使用しています –

+0

@ Milor8、あなたの解決策のポイントは構文ではなく、検証チェックです。さて、助けてくれてありがとう。 – passion053

0

、AA INTO B、BB ...

参照を選択:より多くのコンテキストがなければhttps://dev.mysql.com/doc/refman/5.7/en/select.html

+0

私のクエリは "SELECT value_01、value_02 INTO var_01、var_02 ..."クエリを使用します。そして私が述べたように、それはうまくいきますが、SELECTに結果セットがない場合はSQLWARNINGになります。 – passion053

+0

'col_name = condition_01'は満たされていますか? –

+0

"SELECT ... INTO"は結果がない場合でも警告を出します。 – passion053

関連する問題