12

保存されたプロシージャを作成すると、私はいくつかの変数を作成できますか?例えば:クエリから変数結果を設定します

CREATE PROCEDURE `some_proc`() 
BEGIN 

    DECLARE some_var INT; 
    SET some_var = 3; 
.... 

QUESTION:

DECLARE some_var INT; 
SET some_var = SELECT COUNT(*) FROM mytable ; 

:しかし、どのようにそれがどのようにこのようないくつかを作ることです、クエリからの変数の結果を設定するには?

+0

ここをクリックして、あなたの質問は重複している可能性があります。 http://stackoverflow.com/questions/3888735/mysql-set-user-variable-from-result-of-query?rq=1 – bodi0

+1

いいえ、実際は重複しません。 http://stackoverflow.com/questions/3888735/mysql-set-user-variable-from-result-of-query?rq=1のトピックは「ユーザー定義変数」です。この質問はストアドプロシージャローカル変数に関するものです。私の答えの構文は、ユーザー定義の変数でも動作しますが、逆の言い方ではありません。 –

答えて

33

これには複数の方法があります。

あなたは、サブクエリを使用することができます

SET some_var = (SELECT COUNT(*) FROM mytable); 

(元のように、ちょうどクエリの周りに括弧を追加)

または複数の値を割り当てるための構文INTO SELECTを使用します。

SELECT COUNT(*), MAX(col) 
INTO some_var, some_other_var 
FROM tab; 

サブクエリの構文は少し速いです(なぜか分かりません)が、単一の値を割り当てることができます。 select into構文を使用すると、複数の値を同時に設定できるため、クエリから複数の値を取得する必要がある場合は、各変数に対してクエリを何度も実行するのではなく、それを実行する必要があります。

最後に、結果セットが1行ではなく結果セットを返す場合は、cursorを使用できます。

+0

あなたは間違っています。 –

+0

Roland Bouman、ありがとう、あなたの第二の変種は機能していますが、最初はそうではありません。 :) –

+0

いいえ両方の作品。構文エラーが発生しているはずです。 mysql>デリミタ// mysql>関数を作成するf() - > intを返す - > begin - >宣言v int; - > set v =(デュアルから選択カウント(*)); - > return v; - > end; - > // クエリOK、0行に影響(0.05秒) mysql> select f(); - > // + ------ + | f()| + ------ + | 1 | + ------ + 1行セット(0.00秒) mysql> select version(); - > // + ----------- + |バージョン()| + ----------- + | 5.5.20 | + ----------- + 1行セット(0。私は構文エラー持っている00秒) –

3

次のselect文では、count(*)の結果を保存することができます。

SELECT COUNT(*) FROM mytable INTO some_var; 
+2

MySQLでは、ステートメントの最後にINTO句を最後の句として設定することができます。ただし、標準SQLでは、SELECT句とFROM句の間に表示されます。 –

+0

juergen d、ありがとう。 :) –