今回はSELECTの結果が複数行の場合です。
SELECTの結果が複数行の場合はカーソルを使用します。
カーソルとは
SELECTの結果セットに対して、1行ずつデータを取り出し、順次処理していくためのものです。
カーソルを使用する手順
1. カーソルの宣言する。 CURSOR カーソル名 IS SELECT文; 2. カーソルを開く。 OPEN カーソル名; 3. ループ処理を開始 4. 1行ごとにデータを取り出す。 FETCH カーソル名 INTO 変数 5. データがなければループを終了する EXIT WHEN カーソル名%NOTFOUND; 6. カーソルを閉じる。 CLOSE カーソル名;カーソルを使用してMemberテーブルの全データを取得し、1件づつ変数に代入し出力します。 ※カーソルを使用したデータの取得についてはコチラ「PLSQL カーソルを使用してデータを取得する 」
DECLARE
--カーソル定義
CURSOR member_csr IS
SELECT * FROM Member;
--変数宣言
memberid VARCHAR2(4);
membername VARCHAR2(10);
rank VARCHAR2(2);
BEGIN
--カーソルオープン
OPEN member_csr;
LOOP
--カーソルから1件データを取り出し、変数に代入
FETCH member_csr INTO memberid, membername, rank;
--カーソルにデータがなければ、ループ終了
EXIT WHEN member_csr%NOTFOUND;
--出力
SYS.DBMS_OUTPUT.PUT_LINE(memberid || ' ' || membername || ' ' || rank);
END LOOP;
--カーソルクロース
CLOSE member_csr;
END;
前回「PLSQL SELECTの結果を取得する ~取得結果が1行の場合~ 」と同様に変数宣言のデータ型を「%type属性」にしたパターン。
DECLARE
--カーソル定義
CURSOR member_csr IS
SELECT * FROM Member;
--変数宣言
memberid Member.MemberId%Type;
membername Member.MemberName%Type;
rank Member.Rank%Type;
BEGIN
--カーソルオープン
OPEN member_csr;
LOOP
--カーソルから1件データを取り出し、変数に代入
FETCH member_csr INTO memberid, membername, rank;
--カーソルにデータがなければ、ループ終了
EXIT WHEN member_csr%NOTFOUND;
--出力
SYS.DBMS_OUTPUT.PUT_LINE(memberid || ' ' || membername || ' ' || rank);
END LOOP;
--カーソルクロース
CLOSE member_csr;
END;
Memberテーブルの「%ROWTYPE属性」を使用したパターン
DECLARE
--カーソル定義
CURSOR member_csr IS
SELECT * FROM Member;
--変数宣言
member_rec Member%Rowtype;
BEGIN
--カーソルオープン
OPEN member_csr;
LOOP
--カーソルから1件データを取り出し、変数に代入
FETCH member_csr INTO member_rec;
--カーソルにデータがなければ、ループ終了
EXIT WHEN member_csr%NOTFOUND;
--出力
SYS.DBMS_OUTPUT.PUT_LINE(member_rec.MemberId || ' ' || member_rec.MemberName || ' ' || member_rec.Rank);
END LOOP;
--カーソルクロース
CLOSE member_csr;
END;
カーソルの「%ROWTYPE属性」を使用したパターンカーソルを使用した場合は「レコード変数名 カーソル名%ROWTYPE;」とすることでカーソルの1データを代入できるレコート変数ができます。
DECLARE
--カーソル定義
CURSOR member_csr IS
SELECT * FROM Member;
--レコード型のレコード変数を宣言
member_rec member_csr%Rowtype;
BEGIN
--カーソルオープン
OPEN member_csr;
LOOP
--カーソルから1件データを取り出し、変数に代入
FETCH member_csr INTO member_rec;
--カーソルにデータがなければ、ループ終了
EXIT WHEN member_csr%NOTFOUND;
--出力
SYS.DBMS_OUTPUT.PUT_LINE(member_rec.MemberId || ' ' || member_rec.MemberName || ' ' || member_rec.Rank);
END LOOP;
--カーソルクロース
CLOSE member_csr;
END;
変数宣言のデータ型を自分で定義したレコート型にしたパターン。
DECLARE
--カーソル定義
CURSOR member_csr IS
SELECT * FROM Member;
--レコード型の作成
TYPE member_rec_type IS RECORD
(
MemberId Member.MemberId%type,
MemberName Member.MemberName%type,
Rank Member.Rank%type
);
--レコード型のレコード変数を宣言
member_rec member_rec_type;
BEGIN
--カーソルオープン
OPEN member_csr;
LOOP
--カーソルから1件データを取り出し、変数に代入
FETCH member_csr INTO member_rec;
--カーソルにデータがなければ、ループ終了
EXIT WHEN member_csr%NOTFOUND;
--出力
SYS.DBMS_OUTPUT.PUT_LINE(member_rec.MemberId || ' ' || member_rec.MemberName || ' ' || member_rec.Rank);
END LOOP;
--カーソルクロース
CLOSE member_csr;
END;
0 件のコメント:
コメントを投稿