2016-05-09 5 views
0

MySQLのコマンドライン・クライアントを開き、次のSQL文を入力します。mysストアド・ファンクションに設定されたweiredセッション変数の値

use green; 
delimiter $ 
drop function if exists tstFunction $ 
create function tstFunction(cnt int) returns int 
begin  
    case when 1 > cnt then set @a1 := 1; 
     when 5 > cnt then set @a2 := 2; 
     when 4 > cnt then set @a3 := 3; 
     else set @a4 := 4; 
    end case; 
    return 0; 
end $ 
delimiter ; 

select tstFunction(3), @a1, @a2, @a3, @a4; 

私がテストしたいのは、CASE WHEN複合ステートメントの実行フローです。上記SELECT文のクエリの結果は、ここに行く:

tstFunction(3) @a1 @a2 @a3 @a4 
0     NULL NULL NULL NULL 

私は@a2の値の混乱しています。なぜNULLですか?なぜ2
だから私は新しいMySQLコマンドラインクライアントを開き、tstFunctonを再構築しますが、そのような2つのラインにSELECT文を区切る:

select tstFunction(3); 
select @a1, @a2, @a3, @a4; 

そして新しいクエリ結果が良くなります。

@a1 @a2 @a3 @a4 
NULL 2  NULL NULL 

SELECT声明の最初の形式に起こった?なぜ私はそれを2つに分割する必要がありますSELECTステートメント?

答えて

0

MySQLでは、ローカル変数の宣言は "set"ステートメントで行われます。 SELECT文の最初の形式では、NULLを取得する理由を直接記述しています。

あなたの関数で既に宣言している質問があるかもしれません。しかし、関数と印刷変数の実行は、単一のバッチとして実行されることを意味する単一のSELECT文に含まれています。

2つ目の形式では、2つの異なるバッチで両方のSELECTを実行しているので、変数は関数の値で宣言されます。

あなたがそれらをSELECTのあなたの最初の形で来ているしたい場合があり、それぞれのSELECT文のための単一のバッチがあるので、どのようなバッチ正確な手段ならば、このように前

set @a2 = ''; 
select tstFunction(3), @a1, @a2, @a3, @a4; 
+0

を変数を宣言?私が読む必要がある何か他にありますか? –

+0

バッチは、オプティマイザが一度に処理するステートメントの数を意味します。 –

+0

とにかく、オプティマイザが最初のSELECTフォームのクエリフィールドの計算順序を調整した理由は何ですか?つまり、フィールドは他の3つのフィールドよりも後で計算されるように最適化されています。 –

関連する問題