マニュアルにはできないと書かれているが実際にはできて概ね問題のない動作をしているように見えるのでメモ.もしかすると,本当は何かの制約を満たせないからローカル変数への参照を制限しているのにもかかわらず,抜け道を見つけてしまっただけなのかもしれないので自己責任で.
問題点
MySQLではビューに直接ローカル変数を書き込むことができない.例えば以下の例の場合,
CREATE VIEW get_variable_test_view AS SELECT @variable
#1351 - View's SELECT contains a variable or parameter
というエラーが発生してビューを作ることはできない
解決法
しかし,ローカル変数を返すストアドファンクションを経由するとローカル変数を参照することができる.
CREATE FUNCTION GetVariable() RETURNS INT DETERMINISTIC RETURN @variable;
CREATE VIEW get_variable_test_view AS SELECT GetVariable();
のようにしてストアドファンクションとビューを作った後,
SET @variable = 1000;
SELECT * FROM get_variable_test_view;
のように参照する.この例だとちゃんと1000が返ってくる(MySQL 5.1).
応用
CREATE FUNCTION GetVariable2() RETURNS INT NO SQL RETURN @variable2 := @variable2 + 1;
CREATE VIEW get_variable2_test_view AS SELECT GetVariable2(), GetVariable2();
SET @variable2 = 1000;
SELECT * FROM get_variable2_test_view;
ローカル変数を書き換えることも可能で,この例だと1001,1002が返ってくる.