SQLServerでカーソルを使う方法

プログラミング SQL Server

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でカーソルを使う方法」でした。

タイトルとURLをコピーしました