将记录传递给Ref Cursor

时间:2013-10-04 23:15:36

标签: oracle plsql

我有一个存储过程,我从一组记录(费用)中填充一个表,然后将这些行放入引用游标。

TYPE rctl IS REF CURSOR ;
Fees   t_Fees;
type t_Fees is table of t_FeeRecord index by binary_integer;

type t_FeeRecord is record(
    description         varchar2(80),
    amount              number(12,2),
    taxAmount           number(12,2)
);

--populate the Fees array

INSERT into TEMPORARY_FEE(description,amount,tax) values(Fees(i).description,Fees(i).Amount,Fees(i).Tax);

OPEN rc1 FOR SELECT description,amount TEMPORARY_FEES; 

这一切都正常(填充记录,插入临时表并填充引用游标)但是是否可以消除表并将我的记录数组直接传递到ref_cursor?我必须将结果作为ref_cursor返回给第三方应用程序。

我想我可能会尝试这样的事情。

OPEN rc1 FOR  
SELECT * FROM TABLE(cast(Fees as t_FeeRecord));

但是我的数据类型无效。

1 个答案:

答案 0 :(得分:1)

t_FeeRecordt_Fees声明为数据库对象,而不是pl / sql对象,
在Oracle PL / SQL类型中不能在SQL查询中使用,这会给您数据类型错误(但是,在Oracle 12c中删除了此限制)。

必须将t_FeeRecord创建为对象类型,而不是记录类型,因为记录是PL / SQL类型,不能在SQL查询中使用。

create type t_FeeRecord is object(
    description         varchar2(80),
    amount              number(12,2),
    taxAmount           number(12,2)
);/

create type t_Fees as table of t_FeeRecord; /

这是一个简单的演示,它创建一个记录表,打开该表的引用游标并读取游标并将从游标中检索到的行插入到表中(在11.2g上测试):

create type t_FeeRecord is object(
    description         varchar2(80),
    amount              number(12,2),
    taxAmount           number(12,2)
);
/

create type t_Fees as table of t_FeeRecord; 
/

create table temporary_fee(
  description varchar2(80),
  amount      number(12,2),
  taxAmount   number(12,2)
);

declare
  fees t_Fees;
  TYPE rctl IS REF CURSOR;
  cur rctl;

  rec TEMPORARY_FEE%ROWTYPE;
begin 
  fees := t_Fees (
       t_FeeRecord( 'aaa', 20, 30 ),
       t_FeeRecord( 'bbb', 10, 76 ),
       t_FeeRecord( 'xxx', 4, 23 ),
       t_FeeRecord( 'zzz', 7, 43 ),
       t_FeeRecord( 'ccc', 13, 44 ) );

  open cur for
       select * from table( fees );

  LOOP
     FETCH cur INTO rec;
     EXIT WHEN cur%NOTFOUND;
     INSERT INTO TEMPORARY_FEE VALUES rec;
  END LOOP;
  close cur;
end;  
/

select * from temporary_fee;

DESCRIPTION      AMOUNT  TAXAMOUNT
------------ ---------- ----------
aaa                  20         30 
bbb                  10         76 
xxx                   4         23 
zzz                   7         43 
ccc                  13         44