0

カーソルを宣言したパッケージがあります。そして、そのカーソルを PROCEDURE の OUT 変数として返したいと思います。load_data proc によって最初にデータをロードする必要があるため、そのカーソルからデータを取得することはできません。その MMM_CURSOR を使用したくないのは、同じ選択を使用する追加機能があるためです-DBレベルでのファイルへの書き込み。

create or replace PACKAGE BODY PCG_MMM AS

CURSOR MMM_CURSOR(OFFSET NUMBER) IS 
SELECT TYPE, VALUE FROM MMM_TEMP_LOGS WHERE VALUE = OFFSET;

TYPE RET_TYPE IS REF CURSOR;

PROCEDURE LOAD_DATA AS 
-- loading data into MMM_TEMP_LOGS--
END LOAD_DATA;

PROCDURE WRITE_TO_FILE AS
BEGIN
-- writing to file here --
END WRITE_TO_FILE;

PROCEDURE GET_DATA(DATA RET_TYPE, OFFSET NUMBER:=0) AS
BEGIN
   LOAD_DATA;

   DATA := MMM_CURSOR(OFFSET) ; <--- ??

END GET_DATA;

END PCG_MMM;
4

1 に答える 1

2

プロシージャから CURSOR を渡すことはできませんが、ref カーソルを渡すことはできます。また、カーソルを参照カーソルに変換することもできません。

したがって、そのカーソルをいくつかの場所で使用し、それを渡すことができる場合は、それをビューに変更して、カーソルの代わりに使用することをお勧めします。

例えば

create view MMM_VIEW
as
SELECT TYPE, VALUE FROM MMM_TEMP_LOGS;

(その中で変数を渡していて、パフォーマンスのためにそれを維持する必要がある場合は、「パラメータ化されたビュー」を調べてください)

create or replace PACKAGE BODY PCG_MMM AS

TYPE RET_TYPE IS REF CURSOR;

PROCEDURE LOAD_DATA AS 
-- loading data into MMM_TEMP_LOGS--
  for r_cur in (select * from mmm_view) loop...or whatever (replace the cursor with the view)
END LOAD_DATA;

PROCDURE WRITE_TO_FILE AS
BEGIN
-- writing to file here --
END WRITE_TO_FILE;

PROCEDURE GET_DATA(DATA out RET_TYPE, OFFSET NUMBER:=0) AS
BEGIN
   LOAD_DATA;

   open DATA for select * From mmm_view where value = OFFSET;

END GET_DATA;

END PCG_MMM;
于 2012-12-12T09:59:42.983 に答える