SQL - カーソル:初心者向けガイド

こんにちは、未来のデータベース魔术師さんたち!?今日は、SQLカーソルの世界に興味深い旅をすることになります。カーソルというものを聞いたことがない方もご安心を、このチュートリアルの終わりまでには、データをプロのようにカーソルで操作できるようになるでしょう!さあ、(start)!

SQL - Cursors

SQLにおけるカーソル

カーソルについて少し想像してみてください(mmmm、食べ物?)。あなたにはプレート(あなたのカーソル)があり、ラインを下りていき、一つずつアイテムを拾います。これがSQLでカーソルが行うことです。カーソルは、一度にすべての行を処理するのではなく、結果セットの行を一つずつ処理することを許可します。

より技術的な言葉では、カーソルは結果セットの行を一つずつ巡回するためのデータベースオブジェクトです。結果セット内でどこにいるかを追跡するポインタのようなものです。

カーソルを使う理由

「SELECT文を使えばいいじゃない?」と思うかもしれません。しかし、時々各行に対して個別に操作を行う必要がある場合や、メモリを節約するために大きな結果セットを小さなチャンクに分けて処理する必要がある場合があります。その时候にカーソルが役立ちます!

カーソルのプロパティ

カーソルにはいくつかのプロパティがあり、その振る舞いを定義します。主なものを見てみましょう:

プロパティ 説明
スクロール性 カーソルが前方向にだけ移動するか、前後方向に移動するかを決定します
センシティブ性 カーソルが基盤データに加えられた変更を反映するかどうかを定義します
更新性 カーソルが行を更新または削除するために使用できるかを指定します
トランザクションの動作 カーソルがトランザクションの境界に影響されるかどうかを決定します

これらが抽象的なように思えるかもしれませんが、すぐに実際に動作を見てみましょう!

カーソルのライフサイクル

カーソルの寿命は、4つの主要なステージを持つミニ冒険のようです:

  1. 宣言
  2. 開启
  3. フェッチ
  4. 終了

これらのステージをコード例とともに見ていきましょう。

カーソル宣言文

まず、カーソルを宣言する必要があります。これはSQLに「ああ、この特定のクエリで動作するカーソルを作りたい」と伝えることと同じです。

以下にカーソルの宣言方法を示します:

DECLARE employee_cursor CURSOR FOR
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 10;

この例では、employee_cursorという名前のカーソルを宣言し、department_idが10のemployeesテーブルから従業員の詳細を取得します。

カーソル開启文

カーソルを宣言したら、開启する必要があります。これは「さあ、結果セットを通る旅を始めよう」と言うことと同じです。

OPEN employee_cursor;

このステートメントは、カーソルに関連するSELECTクエリを実行し、フェッチの準備をします。

カーソルフェッチ文

ここが楽しい部分です。データを実際に一つずつ取得するフェッチです。

DECLARE @employee_id INT, @first_name VARCHAR(50), @last_name VARCHAR(50);

FETCH NEXT FROM employee_cursor
INTO @employee_id, @first_name, @last_name;

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT '従業員: ' + @first_name + ' ' + @last_name;

FETCH NEXT FROM employee_cursor
INTO @employee_id, @first_name, @last_name;
END

これを分解すると:

  1. データを保持するための変数を宣言します。
  2. FETCH NEXTを使用してカーソルの次の行を取得します。
  3. WHILEループを使用してすべての行を処理します。@@FETCH_STATUS = 0はフェッチが成功したことを意味します。
  4. ループ内で従業員の名前を表示し、次の行をフェッチします。

これはバッフェットラインを下りていき、一つずつアイテムを拾い上げて何かを行うようなものです。

カーソル終了文

カーソルを使い終わったら、きちんと終了させましょう。これはリソースを解放し、一般的に良い習慣です。

CLOSE employee_cursor;
DEALLOCATE employee_cursor;

カーソルをCLOSEし、DEALLOCATEしてメモリから完全に削除します。

そして、これでカーソルのライフサイクル全体を歩いたことになります。?

注意点

カーソルは強力ですが、間違った使い方をするとリソースを浪費する可能性があります。スプーンでプールを空けるようなものです。これは動作しますが、他に更好的なツールがあるかもしれません。まずは集合ベースの操作を検討し、本当に必要なときにのみ行ごとの処理を行うためにカーソルを使用してください。

結論

おめでとうございます!SQLカーソルの世界への第一歩を踏み出されました。_practice makes perfect_ですので、さまざまなクエリとカーソルのプロパティを試してみてください。

SQLの旅を続ける中で、さらに興味深い機能がたくさんあります。今は自分を褒めて、(you're no longer a cursor newbie!)吧!

ハッピーコーディング、そしてあなたのクエリがいつも期待通りの結果を返すことを祈っています!?

Credits: Image by storyset