1

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

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));

但我得到一个无效的数据类型。

4

1 回答 1

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 
于 2013-10-05T22:31:21.833 回答