1

如果我在 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 插入语句。

我真的很感激帮助!

4

3 回答 3

1

我不认为您可以在 UDT 之外处理 ODP.net 中的 Oracle 类型声明,即使这样我也只使用在数据库中而不是在包中进行的类型声明。

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

哎呀,在任何像样的 UDT 或 XML 支持之前的日子里,我记得一旦双方就格式达成一致,我就将一堆数据填充到 CLOB 中以传递和解析。如果您从未期望更改数据对象,则可以正常工作。否则就是一场翻天覆地的维护噩梦。但可以。

于 2015-02-02T16:51:20.907 回答
0

No it is not possible. You'll need to use some other technique, such as flattening out the record into multiple SProc parameters, using a temp table, etc.

Here is a relevant thread over on the OTN forums. https://community.oracle.com/thread/3620578

于 2015-02-03T00:37:29.773 回答
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;
于 2016-10-27T08:08:03.400 回答