SQLServerではプログラム内でカーソルを利用するとテーブル内に保存されている複数行のデータを簡単にプログラムで扱えるようになります。
今回はカーソルの宣言から使い方、後始末までを解説します。
SQLServerのカーソル文
SQLServerにはプログラム内でテーブルに保存されている複数行のデータをSELECT文で取得することで簡単に扱えるようにするために「CURSOR型」が用意されています。
この「CURSOR型」を使うにはちょっとした「お決まり」があるので、以下にその「お決まり」を解説します。
カーソルの宣言
カーソルは普通の変数と同様に宣言する必要があります。
宣言の方法は以下のように「CURSOR型」の変数を宣言します。
DECLARE @cur CURSOR
カーソルとSELECT文との関連付け
カーソルはSELECT文と関連付けて、そのSELECTの結果をプログラムで利用できるようにするものです。
ですから、カーソルはSELECT文と関連付ける必要があります。
SET @cur = CURSOR FOR SELECT col1 FROM test_table WHERE key_col=10 ORDER BY col_idx
これでSELECT文がカーソル変数と関連付けされました。
カーソルのオープン
カーソルはファイルと同じように利用する前に明示的に「OPEN」する必要があります。
OPEN @cur
OPEN命令でオープンしたいカーソル名を指定します。
SELECT文の取得(FETCH)
カーソルと関連付けたSELECT文の結果を変数へ代入するには「FETCH」を利用します。
FETCH NEXT FROM @cur INTO @work_buff
FECTHはどのカーソルから何という変数へデータを代入するのか指定します。
カーソルには関連付けされたSELECT文の結果が複数行設定されているので、FETCHを繰り返すことで1行ずつ取り出すことができます。
SQLServerではFECTHの終了を判断(最後の行を取得したかどうか)するのに「@@FETCH_STATUS」という関数が用意されているので、これを使って最後の行まで1行ずつ取得します。
FETCH NEXT FROM @cur INTO @work_buff WHILE( @@FETCH_STATUS = 0 ) BEGIN --なんか処理 --次のレコードの取り出し FETCH NEXT FROM @cur INTO @work_buff END
最終行を取得後FECTHを行うと@@FETCH_STATUSが1を返してくるので、それまでループして処理を行います。
カーソル処理の後始末
カーソル処理はファイル処理などと同じ様に、利用したカーソルをクローズして、メモリ上から解放してやる必要があります。
CLOSE @cur --カーソルクローズ DEALLOCATE @cur --リソース開放
カーソルをクローズするには「CLOSE」、メモリ上から解放するには「DEALLOCATE」を利用して行います。
まとめ
カーソルを利用するとプログラム内で複数行選択できるデータを簡単に扱えるようになります。
最後に今回の処理をまとめておきます。
DECLARE @cur CURSOR DECLARE @work_buff VARCHAR(MAX) DECLARE @error_flg int = 0 SET @cur = CURSOR FOR SELECT文 OPEN @cur FETCH NEXT FROM @cur INTO @work_buff WHILE( @@FETCH_STATUS = 0 ) BEGIN --エラー処理 SET @error_flg = @@ERROR IF @error_flg <> 0 --エラーが発生したら BEGIN CLOSE @cur --カーソルクローズ DEALLOCATE @cur --リソース開放 RETURN END --なんか処理 --次のレコードの取り出し FETCH NEXT FROM @cur INTO @work_buff END CLOSE @cur --カーソルクローズ DEALLOCATE @cur --リソース開放
以上、「SQLServerでカーソルを使う方法」でした。