PL/SQLのカーソルは、SQLクエリの結果セットから行ごとにデータ行を処理するメカニズムを提供します。それらは結果セットへのポインターとして機能し、個々の行をフェッチして操作できるようにします。カーソルを使用するには、最初に宣言し、次にそれを開いてクエリを実行し、一度に1つずつ列を取得し、最後に閉じます。これが故障です:
宣言: CURSOR
キーワードを使用してカーソルを宣言し、その後に名前とSQLクエリが続きます。クエリは、処理する必要がある列を選択する必要があります。
<code class="sql">DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 10; BEGIN -- Cursor operations will go here END; /</code>
オープニング: OPEN
ステートメントは、カーソルに関連付けられたクエリを実行し、最初の行の前にカーソルを配置します。
<code class="sql">OPEN emp_cursor;</code>
フェッチ: FETCH
ステートメントは結果セットから行を取得し、値を変数に配置します。カーソルのクエリで選択された列のデータ型と一致する変数を宣言する必要があります。
<code class="sql">DECLARE employee_id employees.employee_id%TYPE; last_name employees.last_name%TYPE; salary employees.salary%TYPE; CURSOR emp_cursor IS ...; -- as declared above BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO employee_id, last_name, salary; EXIT WHEN emp_cursor%NOTFOUND; -- Process the fetched row here DBMS_OUTPUT.PUT_LINE('Employee ID: ' || employee_id || ', Name: ' || last_name || ', Salary: ' || salary); END LOOP; CLOSE emp_cursor; END; /</code>
閉鎖: CLOSE
Statementは、カーソルが保有するリソースをリリースします。リソースの漏れを防ぐために、カーソルを閉鎖することが重要です。
<code class="sql">CLOSE emp_cursor;</code>
emp_cursor%NOTFOUND
属性は、各FETCH
の後にチェックされます。それ以上の行が利用できない場合、それはTRUE
になり、ループは終了します。これは、カーソルによって返される行を反復する標準的な方法です。
PL/SQLにはいくつかのタイプのカーソルがあり、それぞれに長所と短所があります。
SELECT INTO
ステートメントに実行するときにPL/SQLによって自動的に作成されます。それらはプログラマから隠されており、PL/SQLエンジンによって自動的に管理されます。単一の行を取得する簡単なクエリにそれらを使用します。クエリが複数の行を返すと、 TOO_MANY_ROWS
例外が表示されます。選択はお客様のニーズに依存します。単純な単一列検索に暗黙的なカーソルを使用し、明確な制御を備えたより複雑なマルチロー処理のための明示的なカーソル、および動的SQLと手順/関数パラメーターの合格のためのREFカーソルを使用します。
カーソルを使用して大規模なデータセットを処理することは、慎重に処理されない場合は非効率的です。パフォーマンスを改善するためのいくつかの戦略を次に示します。
FORALL
ステートメントのような手法を使用して、複数の行で一度に操作を実行します。これにより、PL/SQLエンジンとデータベースサーバーの間のコンテキストの切り替えが大幅に削減されます。SELECT *
避け、代わりに必要な列のみを指定します。句のWHERE
は、データを効果的にフィルタリングする場合は適切です。はい、あなたはあなたのコードを簡素化し、読みやすさを向上させるためにカーソルを使用したFOR
に多くの場合使用することができます。 FOR
ループは、カーソルの開口部、取得、閉鎖を暗黙的に処理し、コードをより簡潔で理解しやすくします。これは、明示的なカーソルを扱うときに特に有益です。
前に示すようにマニュアルLOOP
とFETCH
の代わりに、以下を使用できます。
<code class="sql">DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 10; BEGIN FOR emp_rec IN emp_cursor LOOP DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_rec.employee_id || ', Name: ' || emp_rec.last_name || ', Salary: ' || emp_rec.salary); END LOOP; END; /</code>
これは、ループFOR
、カーソル反復を自動的に処理します。 emp_rec
レコード変数は、カーソルから取得された各行から値を自動的に受信します。このアプローチは、カーソルを手動で管理するのと比較して、よりクリーンで読みやすく、エラーが発生しやすくなります。これは、PL/SQLでのほとんどのカーソルベースの行処理に適した方法です。
以上がPL/SQLのカーソルを使用して、複数のデータを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。