➡️

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