今回はパラメータ付きカーソルについてです。 カーソルにはパラメータを渡すことができます。 カーソルを定義する際に、カーソル名称とISの間に引数を宣言します。
カーソルFORループを使用せず、明示的にカーソルのオープン、クローズを行うパターンでの使用例
カーソルオープンする際に、カーソルのパラメータを指定する必要があります。
DECLARE
--カーソル定義
CURSOR member_csr(prmMemberId Member.MemberId%Type) IS
SELECT * FROM Member WHERE MemberId >= prmMemberId;
--レコード変数
member_rec member_csr%Rowtype;
BEGIN
--カーソルオープンする際に引数を指定する
OPEN member_csr('2');
BEGIN
LOOP
FETCH member_csr INTO member_rec;
EXIT WHEN member_csr%NOTFOUND;
SYS.DBMS_OUTPUT.PUT_LINE(member_rec.memberid || ' ' || member_rec.membername);
END LOOP;
--カーソルクローズ
CLOSE member_csr;
EXCEPTION
WHEN others THEN
--例外が発生してもカーソルをクローズする
CLOSE member_csr;
--例外を親ブロックへ伝播する。(必要な場合のみ)
RAISE;
END;
END;
カーソルFORループでの使用例
こちらはループごとにパラメータを指定することができます。
DECLARE
--カーソル定義
CURSOR member_csr(prmMemberId Member.MemberId%Type) IS
SELECT * FROM Member WHERE MemberId = prmMemberId;
BEGIN
FOR idx IN 1..3 LOOP
--ループ毎にカーソル引数を指定できる
FOR member_rec IN member_csr(idx) LOOP
SYS.DBMS_OUTPUT.PUT_LINE(member_rec.memberid || ' ' || member_rec.membername);
END LOOP;
END LOOP;
END;
カーソルのパラメータは型を指定することはできますが、精度は指定できません。
DECLARE
CURSOR cur(id VARCHAR2) IS
SELECT * FROM Member WHERE MemberId = id;
BEGIN
FOR rec IN cur('1') LOOP
SYS.DBMS_OUTPUT.PUT_LINE(rec.MemberName);
END LOOP;
END;
0 件のコメント:
コメントを投稿