MySQLのストアドプロシージャでIF ELSEIF ELSEステートメントを使う方法を解説
MySQLにおけるIF ELSEIF ELSEステートメントとは
MySQLのIF ELSEIF ELSEステートメントは、複数の条件式を評価し、その結果に応じて異なる処理を実行したい場合に使用する条件分岐構文です。単純なIF文では二択の分岐しかできませんが、ELSEIFを組み合わせることで、3つ以上の条件に対して柔軟に処理を振り分けることができます。
IF ELSEIF ELSEの基本構文
基本構文は以下の通りです。
IF expression THEN
statements;
ELSEIF elseif-expression THEN
elseif-statements;
……
ELSE
else-statements;
END IF;
各ステートメントは必ずセミコロン(;)で終わる必要がある点に注意してください。上から順に条件式が評価され、最初に真(TRUE)となったブロックの処理が実行されます。どの条件にも当てはまらない場合は、ELSE節の処理が実行されます。
サンプルテーブルの準備
ストアドプロシージャ内でのIF ELSEIF ELSEステートメントの使い方を確認するために、以下のような「student_info」テーブルを用意します。
mysql> Select * from student_info;
+------+---------+------------+------------+
| id | Name | Address | Subject |
+------+---------+------------+------------+
| 101 | YashPal | Amritsar | History |
| 105 | Gaurav | Jaipur | Literature |
| 125 | Raman | Shimla | Computers |
+------+---------+------------+------------+
3 rows in set (0.00 sec)
IF ELSEIF ELSEを使ったストアドプロシージャの作成
次のクエリでは、科目名を入力すると対応するコース名を返す「coursedetails_IF_ELSEIF」というストアドプロシージャを作成しています。引数S_SubjectにはINパラメータ、S_CourseにはOUTパラメータを使用しています。
mysql> DELIMITER // ;
mysql> CREATE PROCEDURE coursedetails_IF_ELSEIF(IN S_Subject Varchar(20), OUT S_Course varchar(20))
-> BEGIN
-> DECLARE Sub Varchar(20);
-> SELECT Subject INTO SUB
-> FROM Student_info WHERE S_Subject = Subject;
-> IF Sub = 'Computers' THEN
-> SET S_Course = 'B.Tech(CSE)';
-> ELSEIF Sub = 'History' THEN
-> SET S_Course = 'Masters in History';
-> ELSEIF Sub = 'Literature' THEN
-> SET S_Course = 'Masters in English';
-> END IF;
-> END //
Query OK, 0 rows affected (0.00 sec)
このプロシージャの処理の流れは以下の通りです。
- DECLARE文でローカル変数Subを宣言する
- SELECT〜INTO構文で、指定した科目に一致するSubjectの値を変数Subに格納する
- IF文でSubの値を順番に評価し、一致する条件のコース名をOUTパラメータに設定する
ストアドプロシージャの実行結果
デリミタを元に戻してから、CALL文でこのプロシージャを呼び出すと、以下のように条件に応じた結果が取得できます。
mysql> Delimiter ; //
mysql> CALL coursedetails_IF_ELSEIF('Computers', @S_Course);
Query OK, 1 row affected (0.00 sec)
mysql> Select @S_Course;
+-------------+
| @S_Course |
+-------------+
| B.Tech(CSE) |
+-------------+
1 row in set (0.00 sec)
mysql> CALL coursedetails_IF_ELSEIF ('Literature', @S_Course);
Query OK, 1 row affected (0.00 sec)
mysql> Select @S_Course;
+--------------------+
| @S_Course |
+--------------------+
| Masters in English |
+--------------------+
1 row in set (0.00 sec)
このように、「Computers」を渡した場合は「B.Tech(CSE)」、「Literature」を渡した場合は「Masters in English」が返され、条件ごとに正しく処理が分岐していることが確認できます。ユーザー定義変数(@S_Course)に結果が格納されるため、SELECT文で簡単に値を参照できるのもポイントです。
まとめ
MySQLのストアドプロシージャでIF ELSEIF ELSEステートメントを使えば、複数の条件に基づいた柔軟な処理の分岐が実現できます。各条件は上から順に評価され、セミコロンでの区切りとEND IFでの締めを忘れないようにしましょう。CASE文との使い分けも検討しつつ、用途に応じて活用するとよいでしょう。
-
MySQLストアドプロシージャ内で別のストアドプロシージャを呼び出す方法
MySQLのストアドプロシージャは、その内部で別のストアドプロシージャを呼び出すことが可能です。これはCALLステートメントを使用することで実現でき、処理をモジュール化して再利用性を高める上で非常に便利な機能です。ここでは、あるストアドプロシージャが別のストアドプロシージャを呼び出し、last_insert_id()を取得する具体例を見ていきましょう。サンプルテーブルの作成まず、例として使用するテーブルを作成します。以下のテーブルは、自動採番されるIDと名前を持つ従業員テーブルです。mysql> CREATE TABLE employee.tbl(Id INT NOT NULL AUTO
-
MySQLでSELECTステートメントを使ってストアドプロシージャを呼び出す方法
MySQLでは、FROM句の中でストアドプロシージャを直接指定してSELECTすることはできません。代わりにCALLコマンドを使ってプロシージャを呼び出し、その後でSELECTステートメントを実行して結果を確認する流れになります。この記事では、実際にテーブルとストアドプロシージャを作成し、CALLで呼び出してからSELECTでデータを取得するまでの手順を順番に解説します。1. サンプルテーブルを作成するまずはデータを格納するためのテーブルを作成しましょう。以下の例では、顧客ID・顧客名・出荷日時を持つテーブルを定義しています。mysql> create table DemoTable2