- - PR -
Oracleのカーソル処理について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2006-09-02 12:02
お世話になります。
Oracle10gの環境で、ストアドプロシージャの開発を行っています。 実現したいことは ・ストアドコール元から指定された行数(以下のソースのBATSIZ)分 フェッチし、結果を配列に格納して返却する(カーソルクローズはしない)。 ・同一セッションから再度コールされた場合、上記の続きから フェッチを行う。 になります。 Oracleのサンプルを流用して、以下のようなロジックを 組みました。 ------------------------------------------------- CREATE OR REPLACE PACKAGE TESTPK IS /* 配列定義 */ TYPE ARY1 IS TABLE OF CHAR(2) INDEX BY BINARY_INTEGER; /* プロシージャ定義 */ PROCEDURE sp1( deptno IN CHAR, BATSIZ IN INTEGER, FND IN OUT INTEGER, FETCH OUT INTEGER, sp1ARY OUT ARY1, ); END; / CREATE OR REPLACE PACKAGE BODY TESTPK IS /* カーソル定義 */ CURSOR CUR1 (P_deptno IN CHAR) IS SELECT jobid FROM enp WHERE deptno = P_deptno ORDER BY jobid; PROCEDURE sp1( deptno IN CHAR, BATSIZ IN INTEGER, -- フェッチする数 FND IN OUT INTEGER, -- フェッチ行があったかどうか FETCH OUT INTEGER, -- フェッチしたかどうか sp1ARY OUT ARY1, ) IS CNT NUMBER(10); BEGIN /* カーソルオープンしていない場合はオープン */ IF NOT CUR1%ISOPEN THEN OPEN CUR1(deptno); END IF; FETCH := 0; FND := 0; /* 実行数までループ */ FOR CNT IN 1..I_BATSIZ LOOP /* フェッチして配列に格納 */ FETCH CUR1 INTO O_ARY_AREA(CNT), O_ARY_MAC(CNT); /* データ未存在の場合 */ IF CUR1%NOTFOUND THEN CLOSE CUR1; -- カーソルクローズ RETURN; ELSE FETCH := 1; FND := IO_FND + 1; END IF; END LOOP; END; END; / ------------------------------------------------- これで実現することはできたのですが、 数点質問があります。 @この方式は、そもそも一般的なのでしょうか? (多重起動や、全部フェッチしきらない(カーソルが残ったまま) うちにストアドコール元が異常終了した場合なども考慮して) A「CURSOR CUR1 (P_deptno IN CHAR) IS〜」で記述されているSQL文のテーブル名を 可変にしたいのですが、実現方法がわかりません。 ご存知の方がいらっしゃいましたら、ご教授ください。 宜しくお願いいたします。 | ||||
|
投稿日時: 2006-09-04 15:37
1 入門書 2 動的SQL | ||||
1
