过程参数中对Oracle UDT的绑定无效

我正在尝试调用一个过程,该过程采用自定义数据类型table of numbers作为参数之一。

以下是类型的定义:

 create type num_list as table of number; 

以及程序的定义:

 create or replace procedure my_procedure (listofnumbers num_list, v_value char) is begin update my_table set my_column = v_value where my_row_id in (select column_value from table(listofnumbers)); end; 

使用ODP.NET和C#,我将其声明如下:

 var row_ids = new int[] { 1, 2 }; using (var oracleConn = new Oracle.DataAccess.Client.OracleConnection(myConnectionString)) { oracleConn.Open(); var cmd = new Oracle.DataAccess.Client.OracleCommand("my_procedure", oracleConn); cmd.CommandType = CommandType.StoredProcedure; var param1 = new Oracle.DataAccess.Client.OracleParameter("listofnumbers", Oracle.DataAccess.Client.OracleDbType.Array, ParameterDirection.Input); param1.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray; param1.UdtTypeName = "num_list"; param1.Value = row_ids; cmd.Parameters.Add(param1); var param2 = new Oracle.DataAccess.Client.OracleParameter("v_value ", Oracle.DataAccess.Client.OracleDbType.Char, ParameterDirection.Input); param2.Value = "Y"; cmd.Parameters.Add(param2); cmd.ExecuteNonQuery(); } 

被抛出的exception状态:

无效的参数绑定参数名称:listofnumbers

在定义参数时我缺少哪些属性?

编辑:5月14日

由于我的回答未被接受,这里有一个可能有用的链接:

http://developergeeks.com/article/35/working-with-user-defined-type-oracle-udt-and-custom-type-using-odp-net-11g


不幸的是我不能玩这个,因为我有x64 ODP.NET不支持UDT。

但是,由于您的UDT是一个集合,您是否尝试在param1上设置Size属性?

 param1.Size = row_ids.Length; 

现在,它不是UDT,但这是一个代码片段,我如何绑定到包规范中定义的类型:

 TYPE t_stringlist IS TABLE OF VARCHAR2(4000); 
 string[] values = new string[] { "AAA", "BBB" }; OracleParameter parameter = new OracleParameter(); parameter.Name = "my_param"; parameter.CollectionType = OracleCollectionType.PLSQLAssociativeArray; parameter.OracleDbType = OracleDbType.Varchar2; parameter.ArrayBindSize = new int[values.Length]; parameter.ArrayBindStatus = new OracleParameterStatus[values.Length]; parameter.Size = values.Length; for (int i = 0; i < values.Length; ++i) { parameter.ArrayBindSize[i] = 4000; parameter.ArrayBindStatus[i] = OracleParameterStatus.Success; } parameter.Value = values; 

我不确定您可以将ArrayBindSize设置为什么值。

另外,您可以考虑为UDT创建一个类型工厂:

http://download.oracle.com/docs/html/E15167_01/featUDTs.htm

无论如何,我希望你能在这里找到有用的东西。