今回はパラメータ付きカーソルについてです。 カーソルにはパラメータを渡すことができます。 カーソルを定義する際に、カーソル名称と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 件のコメント:
コメントを投稿