C# 将记录类型从托管ODP.NET传递到Oracle过程
如果我在PL/SQL包中定义了一条记录,在同一个包中定义了一个过程,那么是否可以在.NET(C#)端创建“记录”类型,并使用类型t_my_rec将其传递给过程。我确信我可以使用UDTs(Oracle用户定义的数据类型)来实现这一点,但因为我使用的是托管驱动程序,它还不受支持C# 将记录类型从托管ODP.NET传递到Oracle过程,c#,.net,oracle,odp.net,odp.net-managed,C#,.net,Oracle,Odp.net,Odp.net Managed,如果我在PL/SQL包中定义了一条记录,在同一个包中定义了一个过程,那么是否可以在.NET(C#)端创建“记录”类型,并使用类型t_my_rec将其传递给过程。我确信我可以使用UDTs(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 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
);
理想情况下,我希望避免为表中的每一项定义数组类型,以便对所有insert语句进行批量处理
我真的很感谢你的帮助 我认为您不能在UDT之外的ODP.net中处理Oracle类型声明,即使这样,我也只能在数据库中而不是在包中进行类型声明
您还可以考虑将对象集合传递到XML对象中,并在两侧进行解析。这确保了您可以定义正在使用的结构,尽管您将产生创建/验证/解析字符串的开销,以及将数字作为字符串而不是几个字节传递的数据开销
见鬼,在任何像样的UDT或XML支持之前的旧日子里,我记得一旦双方都同意了格式,我会将一堆数据塞进CLOB中进行传递和解析。如果您从未想过要更改数据对象,则可以正常工作。否则就是一场翻滚的维护噩梦。但要做到这一点。不,这是不可能的。您需要使用一些其他技术,例如将记录平展为多个存储过程参数、使用临时表等 下面是OTN论坛上的相关帖子。
我也有类似的问题。我已经解决了为记录中的每个字段使用关联数组的问题。记录表并没有一个PL/SQL类型的输出参数,而是将许多参数设置为列。在这个包中,我定义了两种基本类型的关联数组varchar2和number 根据需要创建或替换包xxx
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;