DECLARE
ローカル変数
SET
ステートメント
SELECT ... INTO
ステートメント
ユーザはルーチンの中で変数を宣言して使用することができます。
DECLARE
ローカル変数DECLAREvar_name
[,...]type
[DEFAULTvalue
]
このステートメントはローカル変数を宣言するのに使用します。DEFAULT
節を含ませて、その変数に対するデフォルト値を提供してください。その値は表現として規定することができます。それは定数である必要はありません。DEFAULT
節が含まれていない場合、初期値はNULL
となります。
ローカル変数は、データタイプとオーバーフローチェックに関して、ルーチンパラメータと同じように処理されます。項 「CREATE PROCEDURE
およびCREATE FUNCTION
構文」 を参照してください。
ローカル変数の範囲は、それが宣言されている BEGIN ... END
ブロックの範囲内です。 変数は、同じ名称を使って変数を宣言するこれらのブロックを除く、宣言ブロック内の入れ子を作っているブロックの中に引用することができます。
SET
ステートメントSETvar_name
=expr
[,var_name
=expr
] ...
ストアドルーチン中のSET
ステートメントは一般SET
ステートメントの拡張されたバージョンです。引用された変数は、ルーチンもしくはグローバル システム変数の内側に宣言されたものにすることができます。
ストアドルーチン中のSET
ステートメントは、既存のSET
構文の一部として施行されます。これは、異なった変数タイプ(ローカルに宣言された変数およびグローバル変数並びにセッション・サーバ変数)を混在させることができるSET a=x, b=y, ...
の拡張された構文を容認します。これは、ローカル変数の組み合わせおよびシステム変数に対してだけ意味を持つ幾つかのオプションも認めます。この場合、オプションは認識されますが無視されます。
SELECT ... INTO
ステートメントSELECTcol_name
[,...] INTOvar_name
[,...]table_expr
このSELECT
構文は選択されたカラムを直接変数の中に保存します。従って、1本の横列のみ取り出すことが許されています。
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
ユーザ変数名に対して、大文字小文字を区別されません。項8.4. 「ユーザによって定義された変数」 を参照してください。
重要SQL変数の名称をカラム名称と同じにすべきではありあません。SELECT ... INTO
のようなSQLステートメントが、カラムとローカル変数のリファレンスを同名で含んでいると、現在のMySQLはそのリファレンスを変数名だと認識します。例えば、次のステートメントの中では、xname
はxname
.カラムではなく、変数
カラム対するリファレンスと解釈されます:
CREATE PROCEDURE sp1 (x VARCHAR(5)) BEGIN DECLARE xname VARCHAR(5) DEFAULT 'bob'; DECLARE newname VARCHAR(5); DECLARE xid INT; SELECT xname,id INTO newname,xid FROM table1 WHERE xname = xname; SELECT newname; END;
このプロシージャを呼び出すとき、newname
変数は、table1.xname
カラムに関係なく、値'bob'
.を返します。
項D.1. 「ストアド ルーチンとトリガの規制」も参照してください。