今回は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 件のコメント:
コメントを投稿