前のチュートリアルで、単一行のデータを返す単純カーソルに基づいてカーソルベースのレコード型変数を作成する方法をすでに説明しました。ここで問題が発生するのは、複数行のデータを返すカーソルで同じ単一レコードのデータ型変数を使用できるかどうかです。答えを知るには、読み進めて、単一カーソルベースのレコードデータ型変数を使用してカーソルによって返される複数の値を処理する方法を学びます。
カーソルベースのレコードを扱っているため、カーソルに関する少しの知識が必要です。わかりやすくするため、またこの概念を理解しやすくするために、デモンストレーションにはSimpleExplicit-Cursorを使用します。
ステップ1:単純な明示カーソルを宣言する
カーソルベースのレコードデータ型には、作成済みのカーソルが必要です。このカーソルは、レコード型変数の基になるベースになります。このカーソルを使用して作成されるレコード型変数のすべてのフィールドは、カーソルのSELECT-Listで使用される列と同じ名前とデータ型になります。
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200;
単一行のデータを返す前のチュートリアルのカーソルとは異なり、このカーソルは複数行を返します。これらの行はすべて、従業員IDが200を超えるすべての従業員の名と給与で構成されます。
ステップ2:カーソルベースのレコードデータ型変数を宣言する
カーソルを作成したので、このカーソルを使用してレコード変数を宣言する準備が整いました。
var_emp cur_RebellionRider%ROWTYPE;
Var_empはレコード型変数であり、カーソルcur_RebellionRiderに基づいているため、誇らしげにカーソルベースのレコード型変数と呼ぶことができます。次に、この単一のレコード変数が、基になるカーソルcur_RebellionRiderによって返されるすべてのデータを保持できるかどうかを確認する必要があります。
ステップ3:カーソルレコード変数を初期化する
PL / SQLチュートリアル34で説明したように、レコード変数の初期化は、それにいくつかの値を割り当てるプロセスです。カーソルの場合、FETCH-INTOステートメントがこれを実行します。ただし、カーソルのライフサイクルに正しく従っていることを確認する必要があります。
このカーソルのライフサイクルとカーソルの作成に関連する手順がわからない場合は、「データベースカーソルの概要」に関するこのブログをチェックしてください。
BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary ); END LOOP;--Simple Loop End CLOSE cur_RebellionRider; END;
ここで作成しているPL/SQLブロックの上記の実行セクションは、私のYouTubeチャンネルのビデオチュートリアルで行ごとに説明されています。ぜひチェックしてください。
以上です。それが私たちがしなければならないすべてです。次に、上記のさまざまな手順で見たこれらすべてのコードのチャンクを1つの匿名PL/SQLブロックに結合しましょう。
Oracleデータベースのカーソルベースのレコードデータ型変数
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200; var_emp cur_RebellionRider%ROWTYPE; BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary); END LOOP; CLOSE cur_RebellionRider; END;
上記のコードをコンパイルして実行すると、FETCH-INTOステートメントがカーソルcur_RebellionRiderからフェッチし、カーソルベースのレコード変数var_empに格納されたすべてのデータを取得します。これは、単一のカーソルベースのレコードを使用して実際に複数行のデータを処理できることを意味します。
PL / SQLのビデオチュートリアルで、このコードを単純化できるか、または同じタスクを実行する他の方法があるかを尋ねました。答えは「はい」です。同じ結果を得るには複数の方法があり、そのうちの1つは「カーソルForループ」を使用する方法です。これは、レコード変数を宣言する特殊な種類のループであり、バックグラウンドで暗黙的に基になるカーソルを開き、フェッチし、閉じます。 CursorFor-Loopの詳細についてはこちらをご覧ください。
SQLExpert1z0-047アフィリエイトリンクのリファレンスブック
OCA Oracle Database SQL Certified Expert Exam Guide(Exam 1Z0-047)
これは、上記のコードと同等のCursorFor-Loopを使用して実行されたコードです。ご覧のとおり、Line-of-Code(LOC)が少ないため、それほど複雑ではありません。
SET SERVEROUTPUT ON; BEGIN FOR var_emp IN (SELECT first_name, salary FROM employees WHERE employee_id >200) LOOP DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary); END LOOP; END;
両方が同じタスクを実行しているため、両方のコードは同じ結果を返します。
この詳細なPL/SQLチュートリアルを楽しんでいただけたでしょうか。ランダムに選択されたユーザーに毎月RebellionRiderの商品をプレゼントしているので、これをソーシャルで共有し、タグを付けてください。また、定期的な更新については、ソーシャルメディア[Twitter / Facebook/Instagram]でフォローしてください。
ありがとう&素晴らしい一日を!