MySQLのDECLAREで変数を宣言する方法|ストアドプロシージャでの使い方を解説
MySQLでは、DECLAREステートメントを使ってローカル変数を宣言できます。ただし、DECLAREが使用できるのはストアドプロシージャ(またはファンクション)の中だけという点に注意が必要です。通常のSQL文として単独で実行することはできません。
DECLAREの基本構文
DECLAREの基本的な書き方は以下の通りです。
declare 変数名 データ型;
宣言した変数には、後述するSET文などで値を代入して使用します。なお、DECLAREはBEGIN〜ENDブロックの先頭に記述する必要がある点も押さえておきましょう。
サンプル:ストアドプロシージャで変数を使ってみる
それでは、実際にDECLAREを使ったストアドプロシージャを作成してみましょう。ここでは、引数として渡した数値の2乗を計算して表示するプロシージャを作成します。
mysql> delimiter //
mysql> create procedure square_demo(in Value int)
begin
declare magicValue int;
set magicValue=Value;
select concat('Your Square Value=',magicValue*magicValue) as Output;
end ;
//
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;コードのポイント
- delimiter //:プロシージャ本体の終了を示すセミコロンと区別するため、デリミタを「//」に変更しています。
- declare magicValue int;:整数型(int)のローカル変数「magicValue」を宣言しています。
- set magicValue=Value;:引数Valueの値を変数magicValueに代入しています。
- select concat(...):変数同士を掛け合わせた結果を文字列と連結して出力しています。
作成が完了したら、最後にデリミタを元の「;」に戻しておきましょう。
ストアドプロシージャの呼び出し方
作成したプロシージャは、CALLコマンドで実行できます。
mysql> call square_demo(15);
実行結果
+-----------------------+ | Output | +-----------------------+ | Your Square Value=225 | +-----------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)
引数として渡した15の2乗である「225」が正しく出力されました。このように、DECLAREで宣言した変数は、SET文で値を代入し、SELECTや計算式の中で自由に利用できます。
まとめ
- DECLAREはストアドプロシージャ・ファンクション内でのみ使用可能
- 宣言はBEGINブロックの先頭に記述する
- 値の代入にはSET文を使う
- CALLコマンドでプロシージャを実行できる
変数を活用することで、より柔軟で再利用性の高いストアドプロシージャを作成できます。ぜひ実際に試してみてください。
-
MySQL Workbenchでストアドプロシージャを作成・実行する方法
MySQL Workbenchでストアドプロシージャを作成する手順 まずは、ストアドプロシージャを作成してみましょう。以下は、MySQL Workbenchを使用してストアドプロシージャを作成するためのクエリ例です。 use business; DELIMITER // DROP PROCEDURE IF EXISTS SP_GETMESSAGE; CREATE PROCEDURE SP_GETMESSAGE() BEGIN DECLARE MESSAGE VARCHAR(100); SET MESSAGE="HELLO"; SELECT CONCAT(MESSAGE, ,
-
MySQLストアドプロシージャでSHOW CREATE TABLEを実行する方法
MySQLストアドプロシージャでSHOW CREATE TABLEを実行する方法 ストアドプロシージャの中でSHOW CREATE TABLEを実行したい場合は、動的SQL(プリペアドステートメント)を利用します。SHOW系のコマンドはプロシージャ内に直接記述できないため、SQL文を文字列として組み立てて実行するのがポイントです。 まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable2011 -> ( -> StudentId int NOT NULL AUTO_INCREMENT, -> St