MySQL での変数の宣言と使用
このチュートリアル記事では、MySQL データベースの SQL コード内で変数を宣言する方法を説明します。
SQL スクリプトでは、変数を使用して一連のコマンドの実行中に値を格納し、リテラルの代わりに使用することができます。
MySQL でのユーザー定義変数
MySQL は異なるタイプの変数を認識します。最初のタイプはユーザ定義変数で、プレフィックスとして使用される @
記号で識別されます。MySQL では、事前に宣言したり初期化したりすることなく、ユーザ定義変数にアクセスすることができます。その場合、変数の初期化時には NULL 値が代入されます。例えば、今回のように変数に値を与えずに SELECT
を使用した場合。
SELECT @SomeVariable;
MySQL は NULL 値を返します。
ユーザ定義変数の初期化
ユーザ定義の変数を初期化するには、SET
または SELECT
文を使用する必要があります。このように、各代入文をカンマで区切ることで、多くの変数を一度に初期化することができます。
SET @FirstVar=1, @SecondVar=2;
変数に値を代入すると、その変数は与えられた値に応じた型を持つようになります。前の例では、@FirstVar
と @SecondVar
は int
型です。
ユーザ定義変数の寿命はセッションがアクティブである限り持続し、他のセッションからは見えません。セッションが終了すると、変数は消えます。
ユーザー定義変数に割り当てることができるデータ型は 5つあります。
- 文字列(バイナリまたは非バイナリ
- 整数
- 十進数
- 浮動小数点
NULL
。任意のタイプに関連付けることができます。
変数に値を代入するには、記号 =
または :=
のいずれかを使用することができます。以下の 2つの文は同じ効果があります。
SET @MyIntVar = 1;
SET @MyIntVar := 1;
SELECT
ステートメントで変数をフィールドとして使用する
変数は SELECT
文のフィールドリストの一部として使用することができます。この例のように SELECT でフィールドを指定する際には、変数とフィールド名を混在させることができます。
SET @IndexVar := 1;
SELECT @IndexVar, ISBN FROM Books;
MySQL でローカル変数を宣言する
ローカル変数の名前には接頭辞 @
は必要ありませんが、使用する前に宣言しなければなりません。ローカル変数を宣言するには、DECLARE
文を使用するか、STORED PROCEDURE
宣言内のパラメータとして使用します。
ローカル変数を宣言する際には、オプションでデフォルト値を代入することができます。デフォルト値を代入しない場合、変数は NULL 値で初期化されます。
各変数は、その宣言を含む BEGIN ... END
ブロックで区切られたスコープ内に存在します。
次の例は、ローカル変数をプロシージャのパラメータとして使用する方法と、プロシージャの内部変数として使用する方法の 2つの異なる使用方法を示しています。
DELIMITER $$
CREATE PROCEDURE GetUpdatedPrices(itemcount INT)
BEGIN
DECLARE factor DECIMAL(5, 2);
SET factor:=3.45;
SELECT PartNo, Description, itemcount * factor * ListPrice FROM Catalogue;
END
$$
DELIMITER ;
前の例では、変数 itemcount
がプロシージャに値を渡すためのパラメータとして使用されています。この変数は後に SELECT
文でテーブルから取得した ListPrice
フィールドを乗算するために使われます。ローカル変数 factor
は、結果の価格を乗算するために用いられる 10 進数の値を格納するために用いられます。
MySQL におけるシステム変数の宣言
システム変数と呼ばれる 3つ目のタイプの変数があり、個々のクライアント接続に影響を与える値(SESSION
変数)や、サーバ全体の動作に影響を与える値(GLOBAL
変数)を格納するために使用されます。
システム変数は通常、サーバの起動時に設定されます。これを行うには、コマンドラインを使用するか、オプションファイルに SET
文を含めることができます。しかし、その値は SQL スクリプト内で変更することができます。
システム変数は、プレフィックスとして二重の @
記号を使用するか、SET
文の中で GLOBAL
や SESSION
という単語を使用して識別することができます。GLOBAL
と SESSION
システム変数を区別するもう一つの方法は、2 番目の接頭辞として global
または session
を使用することです。システム変数に値を代入する方法の例をいくつか挙げます。
-- Alternative ways to set session system variables:
SET interactive_timeout=30000;
SET SESSION interactive_timeout=30000;
SET @@interactive_timeout=30000;
SET @@local.interactive_timeout=30000;
-- Alternative ways to set global system variables:
SET @@global.interactive_timeout=30000;
SET GLOBAL interactive_timeout=30000;
セッション内やサーバ内で使用されているシステム変数を表示するには、SHOW VARIABLES
ステートメントを使用します。特定の変数の値を取得したい場合は、比較演算子を追加してこのリストをフィルタリングすることができます。例えば、以下のようになります。
SHOW VARIABLES LIKE '%timeout%'