0

我有我在其中声明游标的包。我想将该游标作为 PROCEDURE 的 OUT 变量返回。我不能只从该游标中获取数据,因为数据需要首先由 load_data proc 加载。我不想使用那个 MMM_CURSOR 因为有额外的功能,它使用相同的选择 - 在数据库级别写入文件。

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 回答