2010-11-24 49 views
5

中的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(); 
} 

抛出异常状态:

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

性质我在定义参数丢失了怎么办?

+0

嗨,你是怎么解决这个问题的?下面的答案对我不起作用。 – Jason 2012-09-02 11:48:34

回答

2

编辑:5月14日

正如我的回答得到了接受的,这里是一个可能是有用的链接:

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


可惜我不能玩这个作为我有不支持UDT的x64 ODP.NET。

但是,由于您的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

无论如何,我希望你能找到的东西在这里没有什么帮助。