カーソル 一時メモリまたは一時ワークステーションです。によって割り当てられます データベース ユーザーがテーブルに対して DML (データ操作言語) 操作を実行するときのサーバー。カーソルはデータベース テーブルを格納するために使用されます。
カーソルには、暗黙的カーソルと明示的カーソルの 2 種類があります。これらを以下に説明します。
- 暗黙的なカーソル: 暗黙的カーソルは、SQL SERVER のデフォルト カーソルとも呼ばれます。これらのカーソルは、ユーザーが DML 操作を実行するときに SQL SERVER によって割り当てられます。
- 明示的なカーソル: 明示的なカーソルは、ユーザーが必要とするたびにユーザーによって作成されます。明示的カーソルは、テーブルから行ごとにデータを取得するために使用されます。
明示的なカーソルを作成するには?
- カーソルオブジェクトの宣言
構文:
DECLARE カーソル名 CURSOR FOR SELECT * FROM テーブル名
クエリ:
DECLARE s1 CURSOR FOR SELECT * FROM studDetails>
2. カーソル接続を開く
それ以外の場合は bash シェルで
構文:
カーソル接続を開く
クエリ:
OPEN s1>
カーソルからデータを取得する カーソルからデータにアクセスする方法は合計 6 つあります。それらは次のとおりです。
- 初め カーソルテーブルから最初の行のみをフェッチするために使用されます。
- 最後 カーソルテーブルから最後の行のみをフェッチするために使用されます。
- 次 カーソルテーブルから順方向にデータをフェッチするために使用されます。
- 前 カーソルテーブルから逆方向にデータをフェッチするために使用されます。
- 絶対値n 正確な n を取得するために使用されます番目カーソルテーブルの行。
- 相対n は、増分的方法と減分的方法でデータをフェッチするために使用されます。
構文:
FETCH NEXT/FIRST/LAST/PRIOR/ABSOLUTE n/RELATIVE n FROM カーソル名
クエリ:
FETCH FIRST FROM s1 FETCH LAST FROM s1 FETCH NEXT FROM s1 FETCH PRIOR FROM s1 FETCH ABSOLUTE 7 FROM s1 FETCH RELATIVE -2 FROM s1>
- カーソル接続を閉じる
構文:
CLOSE カーソル名
クエリ:
CLOSE s1>
- カーソルメモリの割り当てを解除する
構文:
DEALLOCATE カーソル名
クエリ:
DEALLOCATE s1>
暗黙的なカーソルを作成するには?
暗黙的カーソルは、SQL 文の実行時に PL/SQL によって自動的に作成されるカーソルです。暗黙的なカーソルを明示的に宣言したり開いたりする必要はありません。代わりに、PL/SQL がバックグラウンドでカーソルを管理します。
PL/SQL で暗黙的カーソルを作成するには、SQL 文を実行するだけです。たとえば、EMP テーブルからすべての行を取得するには、次のコードを使用できます。
クエリ:
BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;>
PL/SQL で実行すると、 入れる 、 アップデート または 消去 操作を行うと、暗黙的なカーソルが自動的に作成されます。このカーソルは、挿入されるデータを保持するか、更新または削除される行を識別します。コード内では、このカーソルを SQL カーソルとして参照できます。この SQL カーソルには、いくつかの便利な属性があります。
- 最新の SQL 操作が少なくとも 1 行に影響を与えた場合、%FOUND は true になります。
- どの行にも影響を与えなかった場合、%NOTFOUND は true になります。
- %ROWCOUNT は、影響を受ける行数を返します。
- %ISOPEN は、カーソルが開いているかどうかを確認します。
これらの属性に加えて、%BULK_ROWCOUNT および %BULK_EXCEPTIONS は FORALL ステートメントに固有のものであり、複数の DML 操作を一度に実行するために使用されます。 %BULK_ROWCOUNT は各 DML 操作によって影響を受ける行数を返し、%BULK_EXCEPTION は操作中に発生した例外を返します。
クエリ:
CREATE TABLE Emp( EmpID INT PRIMARY KEY, Name VARCHAR(50), Country VARCHAR(50), Age int(2), Salary int(10) ); -- Insert some sample data into the Customers table INSERT INTO Emp (EmpID, Name,Country, Age, Salary) VALUES (1, 'Shubham', 'India','23','30000'), (2, 'Aman ', 'Australia','21','45000'), (3, 'Naveen', 'Sri lanka','24','40000'), (4, 'Aditya', 'Austria','21','35000'), (5, 'Nishant', 'Spain','22','25000'); Select * from Emp;>
出力:

このプログラムは、各従業員の給与を 1500 ずつ増やすことによってテーブルを更新します。更新後、SQL%ROWCOUNT 属性を使用して、操作によって影響を受けた行数がわかります。
クエリ:
DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>
出力:
5 Emp selected PL/SQL procedure successfully completed.>
SQL カーソルの例外
SQL クエリを実行するときは常に、予期しないエラーが発生する可能性があります。カーソルは行の各セットを移動して SQL クエリで返します。
非常に一般的な例外がいくつかあります。
- 重複する値: このタイプのエラーは、カーソルがデータベースにすでに存在するレコードまたはタプルを挿入しようとしたときに発生します。このようなタイプのエラーは、適切なエラー設定を処理することで回避できます。
- 無効なカーソル状態: カーソルが無効な状態にある場合、このタイプのエラーはエラーとして表示されます。
- ロックタイムアウト: これは、カーソルが行またはテーブルのロックを取得しようとしたが、そのロックがすでに別のトランザクションによって保持されている場合に発生します。
SQLサーバーでのカーソルの必要性
- カーソルを使用すると、データを行ごとに処理できるため、データに対して複雑な計算や変換を実行する必要がある場合に役立ちます。
- カーソルを使用すると、結果セットを複数回繰り返すことができるため、同じデータに対して複数の操作を実行する必要がある場合に便利です。
- カーソルは、階層データ構造を処理する場合や再帰クエリを実行する場合など、複雑な関係を持つ複数のテーブルを結合する必要がある場合に役立ちます。
- カーソルを使用すると、何らかの条件や基準に基づいてレコードの更新、削除、挿入などの操作を実行できます。
- カーソルは、関係が単純ではない複数のテーブルのデータを処理する場合に特に役立ちます。
SQL Server のカーソル制限
カーソルにはいくつかの制限があるため、他に選択肢がない場合にのみ使用してください。これらの制限には次のものが含まれます。
- データを処理するとき、サブセットまたはテーブル全体にロックがかかります。
- カーソルはテーブル レコードを一度に 1 行ずつ更新するため、パフォーマンスが低下します。
- ループはカーソルよりも遅いですが、オーバーヘッドが大きくなります。
- カーソルの速度に影響を与えるもう 1 つの要因は、カーソルに取り込まれる行と列の量です。
よくある質問:
Q.1 カーソルを回避するにはどうすればよいですか?
答え:
カーソルの主な機能は、表を行ごとに移動することです。以下に、カーソルを回避するための簡単な方法をいくつか示します。
Q.2 SQL カーソルで While ループを使用するにはどうすればよいですか?
答え:
while ループを使用すると、結果セットを一時テーブルに挿入でき、カーソルの必要性を回避する最も簡単な方法です。
Q.3 SQLカーソルのユーザー定義関数とは何ですか?
答え:
場合によっては、結果の行セットがカーソルを使用して計算されます。これは、仕様に準拠したユーザー定義関数を採用することで実現できます。
Q.4 SQL カーソルを使用した結合は使用できますか?
答え:
巨大なレコードを処理する必要がある場合、結合は、指定された条件を満たす列のみを処理することでコードの行数を削減します。