- PR -

Oracleのカーソル処理について

1
投稿者投稿内容
のりすけ
会議室デビュー日: 2006/05/10
投稿数: 9
投稿日時: 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/08/30
投稿数: 1034
投稿日時: 2006-09-04 15:37
引用:

@この方式は、そもそも一般的なのでしょうか?
 (多重起動や、全部フェッチしきらない(カーソルが残ったまま)
  うちにストアドコール元が異常終了した場合なども考慮して)

A「CURSOR CUR1 (P_deptno IN CHAR) IS〜」で記述されているSQL文のテーブル名を
 可変にしたいのですが、実現方法がわかりません。




1 入門書
2 動的SQL
1

スキルアップ/キャリアアップ(JOB@IT)