機能説明
VastbaseはMySQL互換モードにおいて、ユーザ変数@variableの以下の2つの使用形式をサポートします:
SETコマンドによる変数宣言:SET @variable = valueまたはSET @variable := valueSELECTコマンドによる変数代入:SELECT @variable := value
この機能を使用することで、SQLにおける再帰クエリの実装が可能になります(例3参照)。再帰クエリは、データセット全体をループ処理によって探索する特殊なクエリ技術であり、階層構造やグラフ構造のデータ処理に適しています。
注意事項
- 本機能を使用するには、パラメータ
enable_set_variable_b_formatを有効にする必要があります - ユーザ変数は現在接続中のユーザに固有であり、接続セッション中は有効です
SETコマンドでは:=と=の両方を使用可能ですが、SELECTでの代入では:=のみサポートされますPREPARE FROMでSQL文に名前を付ける場合、ユーザ変数に格納する文字列は単一のSELECT/INSERT/UPDATE/DELETE/MERGE文である必要があります- SETおよびSELECTの両方で複数の変数への同時代入が可能です
使用例
例1: SETコマンドによる変数代入
-- パラメータ設定
SET enable_set_variable_b_format=on;
-- 変数定義
SET @user_var1 = 100;
SET @user_var2 := 2000::int4;
SET @var_a := @var_b := @var_c := 999999::int8;
-- 変数値の確認
SELECT @user_var1, @user_var2, @var_a;
-- テーブル作成
CREATE TABLE sample_data (record_id INT, record_name TEXT);
-- 変数を使用したデータ挿入
INSERT INTO sample_data VALUES(@user_var1, 'sample text');
-- データ確認
SELECT * FROM sample_data;
例2: SELECTによる変数代入
SET enable_set_variable_b_format=on;
SELECT @val1:=10 AS column1, @val2:=30;
例3: 再帰クエリの実装
SET enable_set_variable_b_format=on;
-- 階層データテーブルの作成
CREATE TABLE hierarchical_data (
node_id INT PRIMARY KEY AUTO_INCREMENT,
node_name VARCHAR(255) NOT NULL,
parent_node INT,
CONSTRAINT name_unique UNIQUE (node_name),
CONSTRAINT parent_fk FOREIGN KEY (parent_node) REFERENCES hierarchical_data(node_id)
);
-- テストデータ投入
INSERT INTO hierarchical_data (node_name, parent_node) VALUES
('node1', 1),
('node2', 2),
('node3', 1),
('node4', 2),
('node5', 1),
('node6', 2);
-- 変数設定と兄弟ノード検索
SET @target_node := 1;
SELECT node_id, node_name
FROM hierarchical_data
WHERE parent_node = (
SELECT parent_node
FROM hierarchical_data
WHERE node_id = @target_node
);
例4: 動的SQLの準備
SET enable_set_variable_b_format=on;
CREATE TABLE temp_table(col_id INT);
-- SQL文を変数に格納
SET @dynamic_sql1 := 'INSERT INTO temp_table VALUES(10)';
SET @dynamic_sql2 := 'SELECT * FROM temp_table';
-- プリペアドステートメントの作成
PREPARE insert_stmt FROM @dynamic_sql1;
PREPARE select_stmt FROM @dynamic_sql2;
-- 実行
EXECUTE insert_stmt;
EXECUTE select_stmt;