ストアドプロシージャはデータベース・エンジンを制御するプログラムであり、Transact-SQLはストアドプロシージャを記述するためのプログラミング言語の機能を提供しています。引数や変数もその1つですが、さらに条件判断・分岐などの制御構造も記述できます。
- 結果によって戻り値を切り替える -
前回紹介した「商品名の一部を指定して、商品_mrから一致する商品の商品IDを抽出する」処理“GetItemId”に手を加え、
引数に合致するレコードが存在すれば商品IDを返し
合致するレコードが存在しなければ-1を返す
──ようにしてみましょう。
まず、Return命令で単純に「商品ID」を返す“GetItemId1”のソースをもう一度掲げておきます。
Create Procedure GetItemId1
@ItemName varchar(30)
As
DECLARE @ItemId int
SELECT @ItemId = 商品ID FROM 商品_mr
WHERE 品名 Like '%' + @ItemName + '%'
Return @ItemId
- If~Elseによる条件判断と分岐 -
これを、以下のように書き直してみます。プロシージャ名は“GetItemId3”としておきましょう(ex03.sql)。
Create Procedure GetItemId3
@ItemName varchar(30)
As
DECLARE @ItemId int
Set @ItemId = 0
SELECT @ItemId = 商品ID FROM 商品_mr
WHERE 品名 Like '%' + @ItemName + '%'
If @ItemId = 0 ------- @ItemIdが0なら-1を返す
Return -1
Else ----------------- そうでなければそのまま@ItemIdを返す
Return @ItemId
最後のRetunで値を返すところで、If~Elseを使って処理を分岐させています。
SELECT @ItemId = 商品ID FROM 商品_mr
WHERE ...
の箇所で、引数に部分的に一致するレコードが見つからなければ@ItemIdの値は0になります。そこでIfを使って@ItemIdの値が0かどうかを調べ、0ならIfに続く“Return -1”を、そうでなければElseに続く“Return @ItemId”を実行します。
- プロシージャの実行 -
このプロシージャを実行してみましょう。実行方法は前回と同じです。まず、合致するレコードの存在する文字列を引数に与えてみます。この場合は、該当するレコードの商品IDが返ってきます。
DECLARE @Id int
EXECUTE @Id = GetItemId3 'プレート'
SELECT @Id '商品ID'
次に、商品名に存在しない文字列を引数に与えて実行します。該当する商品が存在しないので、-1が返ってきます。
DECLARE @Id int
EXECUTE @Id = GetItemId3 'パンツ'
↑商品名には存在しない文字列
SELECT @Id '商品ID'
- If~Elseの基本書式 -
条件判断と分岐の構造は、一般的なプログラミング言語と同じでIf~Elseを使います。
If <条件>
<処理1>
Else
<処理2>
<条件>が真(成立)なら<処理1>が、偽(不成立)なら<処理2>が実行されます。
条件式には、=(等しい)、<>(等しくない)、>(未満)、<(より大きい)、=>以下、=<(以上)の比較演算子が使えます。この点も、一般的なプログラミング言語の仕様と同じです。
|