Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将记录类型从托管ODP.NET传递到Oracle过程_C#_.net_Oracle_Odp.net_Odp.net Managed - Fatal编程技术网

C# 将记录类型从托管ODP.NET传递到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

如果我在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,
   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;