以下はその時に使用したコードで、カーソルを使用して、データを取得しています。
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 例外処理のネスト 」でまとめたように、例外が発生してもカーソルが確実に閉じられるようにします。
DECLARE --カーソル定義 CURSOR member_csr IS SELECT * FROM Member; --変数宣言 memberid VARCHAR2(4); membername VARCHAR2(10); rank VARCHAR2(2); BEGIN --カーソルオープン OPEN member_csr; BEGIN 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; EXCEPTION WHEN others THEN --例外が発生してもカーソルをクローズする CLOSE member_csr; --例外を親ブロックへ伝播する。(必要な場合のみ) RAISE; END; END;
カーソルFORループ
カーソルFORループを使用すると、カーソルを使用してデータを取得する際の以下の処理が省略できます。
- カーソルのデータを格納する変数を宣言する。
- カーソルをオープンする。
- フェッチで1行分のデータを取り出す。
- カーソルを閉じる。
FOR レコード変数 IN カーソル LOOP 処理 END LOOP;カーソルFORループを使用して、データを取得するコードです。
DECLARE --カーソル定義 CURSOR member_csr IS SELECT * FROM Member; BEGIN FOR member_rec IN member_csr LOOP SYS.DBMS_OUTPUT.PUT_LINE(member_rec.memberid || ' ' || member_rec.membername); END LOOP; END;
0 件のコメント:
コメントを投稿