➡️
CURSOR(カーソル)
カーソルとは
カーソルは、SELECTで取得した複数行の結果セットから1行ずつ処理したいときに使う仕組みです。ループ処理や行ごとの更新・削除が必要なケースで登場します。
基本構成
カーソルは以下の3ステップで使います。
1.DECLARE CURSOR:SQLで抽出する行集合を定義
2.FETCH:その結果セットから1行ずつ取り出す
3.WHERE CURRENT OF:現在フェッチした行に対して更新・削除を行う(必要な場合)
例
以下は、70点未満の学生だけをカーソルで走査し、コメント列を更新する例です。
-- ① カーソルの宣言
DECLARE score_cursor CURSOR FOR
SELECT student_id, math_score
FROM student_score
WHERE math_score < 70;
-- ② カーソルをオープン
OPEN score_cursor;
-- ③ 1行ずつ取り出して処理
FETCH NEXT FROM score_cursor
INTO @id, @score;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE student_score
SET comment = '要補習'
WHERE CURRENT OF score_cursor; -- ここでカーソルの行を指定
FETCH NEXT FROM score_cursor INTO @id, @score;
END
-- ④ 終了処理
CLOSE score_cursor;
DEALLOCATE score_cursor;
なぜカーソルを使うのか?
- 一括更新だと副作用やロック範囲が広くなりすぎる場合
- 行ごとに別処理や条件分岐が必要なケース
- トランザクション管理を細かくしたいとき
バッチ処理・帳票出力・期間経過後の清掃処理などでよく使われます。
Discussion