ローカル変数のスコープは、それが宣言されている
BEGIN ... END
ブロックのスコープ内です。変数は、同じ名称を使って変数を宣言するこれらのブロックを除く、宣言ブロック内の入れ子を作っているブロックの中に引用することができます。
ローカル変数名をカラム名と同じにはしないでください。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'
.を返します。
Restrictions on Stored Routines, Triggers, and Events も参照してください。