将记录传递到参考光标
Posted
技术标签:
【中文标题】将记录传递到参考光标【英文标题】:Pass Record into Ref Cursor 【发布时间】:2013-10-04 23:15:36 【问题描述】:我有一个存储过程,我从记录数组(费用)中填充表,然后将这些行放入参考游标。
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));
但我得到了一个无效的数据类型。
【问题讨论】:
不适用于包中定义的类型,因为 PL/SQL 类型不能在 SQL 中使用(即使该 SQL 本身在 PL/SQL 中)。您的演员表也是错误的,table()
不对记录类型进行操作。如果t_fees
在SQL 级别用create type
声明,那么您可以只使用select * from table(fees)
。这可行吗?
【参考方案1】:
将t_FeeRecord
和t_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
【讨论】:
以上是关于将记录传递到参考光标的主要内容,如果未能解决你的问题,请参考以下文章