ストアドルーチン内の変数

1. DECLARE ローカル変数
2. 変数 SET ステートメント
3. SELECT ... INTO ステートメント

ユーザはルーチンの中で変数を宣言して使用することができます。

1. DECLARE ローカル変数

DECLARE var_name[,...] type [DEFAULT value]

このステートメントはローカル変数を宣言するのに使用します。DEFAULT節を含ませて、その変数に対するデフォルト値を提供してください。その値は表現として規定することができます。それは定数である必要はありません。DEFAULT節が含まれていない場合、初期値はNULLとなります。

ローカル変数は、データタイプとオーバーフローチェックに関して、ルーチンパラメータと同じように処理されます。項 「CREATE PROCEDUREおよびCREATE FUNCTION 構文」 を参照してください。

ローカル変数の範囲は、それが宣言されている BEGIN ... END ブロックの範囲内です。 変数は、同じ名称を使って変数を宣言するこれらのブロックを除く、宣言ブロック内の入れ子を作っているブロックの中に引用することができます。

2. 変数 SET ステートメント

SET var_name = expr [, var_name = expr] ...

ストアドルーチン中のSETステートメントは一般SETステートメントの拡張されたバージョンです。引用された変数は、ルーチンもしくはグローバル システム変数の内側に宣言されたものにすることができます。

ストアドルーチン中のSETステートメントは、既存のSET構文の一部として施行されます。これは、異なった変数タイプ(ローカルに宣言された変数およびグローバル変数並びにセッション・サーバ変数)を混在させることができるSET a=x, b=y, ...の拡張された構文を容認します。これは、ローカル変数の組み合わせおよびシステム変数に対してだけ意味を持つ幾つかのオプションも認めます。この場合、オプションは認識されますが無視されます。

3. SELECT ... INTO ステートメント

SELECT col_name[,...] INTO var_name[,...] table_expr

このSELECT 構文は選択されたカラムを直接変数の中に保存します。従って、1本の横列のみ取り出すことが許されています。

SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

ユーザ変数名に対して、大文字小文字を区別されません。項8.4. 「ユーザによって定義された変数」 を参照してください。

重要SQL変数の名称をカラム名称と同じにすべきではありあません。SELECT ... INTO のようなSQLステートメントが、カラムとローカル変数のリファレンスを同名で含んでいると、現在のMySQLはそのリファレンスを変数名だと認識します。例えば、次のステートメントの中では、xnamexname.カラムではなく、変数 カラム対するリファレンスと解釈されます:

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. 「ストアド ルーチンとトリガの規制」も参照してください。