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

Passing Record type from Managed ODP.NET to Oracle Procedure

如果我在 PL/SQL 包中定义了一条记录,并且在同一包中定义了一个过程,是否可以在 .NET (C#) 端创建 "record" 类型并通过它使用类型 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
);

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

非常感谢您的帮助!

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

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

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

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

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

我遇到了类似的问题。我已经解决了为记录中的每个字段使用关联数组的问题。而不是具有 PL / SQL table 类型的单个输出参数的记录具有如此多的参数作为列。在包中我定义了两种基本类型的关联数组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;