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

C# 过程参数中的Oracle UDT绑定无效,c#,odp.net,oracle-xe,user-defined-types,C#,Odp.net,Oracle Xe,User Defined Types,我试图调用一个过程,该过程将自定义数据类型数字表作为参数之一 以下是类型的定义: 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

我试图调用一个过程,该过程将自定义数据类型
数字表
作为参数之一

以下是类型的定义:

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();
}
正在引发的异常状态为:

无效的参数绑定参数 名称:编号列表


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

编辑:5月14日

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


不幸的是,我无法处理这个问题,因为我有x64 ODP.NET,它不支持UDT

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

param1.Size = row_ids.Length;
现在,它不是UDT,但下面是我如何绑定到包规范中定义的类型的代码片段,如下所示:

TYPE t_stringlist IS TABLE OF VARCHAR2(4000);

字符串[]值=新字符串[]{“AAA”,“BBB”};
OracleParameter=新的OracleParameter();
parameter.Name=“my_param”;
parameter.CollectionType=OracleCollectionType.plsqlAssociationArray;
parameter.OracleDbType=OracleDbType.Varchar2;
parameter.ArrayBindSize=newint[values.Length];
parameter.ArrayBindStatus=新OracleParameterStatus[values.Length];
parameter.Size=values.Length;
对于(int i=0;i
我不确定您可以将ArrayBindSize设置为什么值

也可以考虑为UDT创建一个类型工厂:


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

嗨,你是如何解决这个问题的?下面的答案不适用于我。请尝试我在编辑的答案中发布的链接中提供的解决方案。PS下面的答案适用于我-您不能设置UdtTypeName,而是使用CollectionType。

            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;