将记录传递到参考光标

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_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 

【讨论】:

以上是关于将记录传递到参考光标的主要内容,如果未能解决你的问题,请参考以下文章

vim 光标移动到屏幕下一行

PyMongo 光标列出可能的最快方式

input移动光标至开头

vim 中将光标从行头移到行尾的快捷键是啥

如何将额外元素插入到 SimpleCursorAdapter 或 Spinner 的光标中?

是否可以通过 Android 中的 IPC 传递光标?