将记录类型从托管ODP.NET传递到Oracle过程

时间:2015-02-02 11:43:40

标签: c# .net oracle odp.net odp.net-managed

如果我在PL / SQL包中定义了记录并在同一个包中定义了一个过程,是否可以创建"记录"在.NET(C#)端键入,并使用类型t_my_rec将其传递给过程。我确信我可以使用UDT(Oracle用户定义的数据类型)执行此操作,但由于我使用的是托管驱动程序,因此尚不支持。

TYPE t_arr_my_rec IS TABLE OF t_my_rec INDEX BY PLS_INTEGER;

TYPE t_my_rec IS RECORD
(
   item_id items.item_id%type,
   item_name items.item_name%type
);

PROCEDURE insert_my_rec
(
   p_my_rec in t_my_rec
);

PROCEDURE bulk_insert_my_rec
(
   p_my_recs in t_arr_my_rec
);

理想情况下,我希望避免为表中的每个项目定义数组类型来执行批量FORALL插入语句。

我真的很感激帮助!

3 个答案:

答案 0 :(得分:1)

我认为你不能在UDT之外的ODP.net中处理Oracle类型声明,即便如此,我只是在数据库中而不是在包中进行了类型声明。

您还可以考虑在XML对象中传递对象集合并在两侧解析它。这确保您可以定义正在运行的结构,尽管您将承担创建/验证/解析字符串的开销,以及将数字作为字符串而不是几个字节传递的数据开销。

哎呀,在过去任何体面的UDT或XML支持之前,我都记得将一堆数据填充到CLOB中以便传递并解析,一旦双方同意格式。如果您从未期望更改数据对象,则工作正常。否则就是翻转维护的噩梦。但是可以做到。

答案 1 :(得分:0)

不,不可能。您需要使用其他一些技术,例如将记录展平为多个SProc参数,使用临时表等。

以下是OTN论坛上的相关主题。 https://community.oracle.com/thread/3620578

答案 2 :(得分:0)

我有类似的问题。我已经解决了为记录中的每个字段使用关联数组。而不是具有PL / SQL类型的单个输出参数记录表具有如此多的参数列。在包中,我定义了两种基本类型的varchar2和number的关联数组。

创建或替换包xxx AS

type t_tbl_alfa is table of varchar2(50) index by binary_integer;
type t_tbl_num  is table of number index by binary_integer;