カーソルを使うことでSELECT文で抽出したレコード群から、
1行毎に値を使用してループ処理を行うことができます。
複雑な処理をしたい場合に非常に便利です。文例を基に説明します。
テストテーブル作成
SQL
--テストテーブル作成
create table #test
(
[number1] int,
[number2] int
)
--テストデータ挿入
insert into
#test
values
(3,5),
(4,2),
(5,10)
SQLカーソル実行
SQL
--変数定義
DECLARE @cur CURSOR
DECLARE @number1 int
DECLARE @number2 int
--カーソルオープン
SET @cur = CURSOR FOR SELECT [number1],[number2] from #test
OPEN @cur
--1レコード目セット
FETCH NEXT FROM @cur INTO @number1,@number2
--ループ開始
WHILE( @@FETCH_STATUS = 0 )
BEGIN
--処理
print @number1 * @number2
--次レコード
FETCH NEXT FROM @cur INTO @number1,@number2
END
--カーソルクローズ
CLOSE @cur
DEALLOCATE @cur
SQL【変数定義】
・CURSOR型は固定で必須。
・残りはSELECT文で抽出する、ループ処理の中で使用したい値を格納するためのもの。
今回は[number1][number2]をループ処理の中で使用するため、格納するための変数を用意した。
【カーソルオープン】
・ループを回すレコードを抽出するSELECT文を記述
・例文では使用していないが、where句も使用できる
【1レコード目セット】
・先頭の1レコード目のSELECT結果を変数に格納する
【ループ開始】
・WHILE( @@FETCH_STATUS = 0 )で、レコードがなくなるまでループの意味
・任意の処理を行った後に、FETCH NEXTで次のレコードへ
【カーソルクローズ】
・終了処理
【結果】
15
8
50