2010-11-24 28 views
5

Estoy intentando llamar a un procedimiento que toma un tipo de datos personalizado de table of numbers como uno de los parámetros.Enlace no válido para Oracle UDT en el parámetro de procedimiento

Aquí es la definición del tipo:

create type num_list as table of number; 

Y la definición del procedimiento:

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; 

Usando ODP.NET y C#, Estoy declarando la siguiente manera:

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

La excepción que se arroja estados:

Parámetro no válido enlace de parámetros nombre: ListOfNumbers

¿Qué propiedades son yo que falta en la definición del parámetro?

+0

Hola, ¿cómo terminaste resolviendo esto? La respuesta a continuación no funcionó para mí. – Jason

+0

Pruebe la solución que se ofrece en el enlace que publiqué en mi respuesta editada. –

+0

PD la respuesta a continuación me funciona; no debe establecer UdtTypeName, sino usar CollectionType. –

Respuesta

2

EDIT: 14 de mayo de

Como mi respuesta consiguió no aceptada, aquí es un enlace que pueda ser de utilidad:

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


Por desgracia, no se puede jugar con esto, ya Tengo x64 ODP.NET que no es compatible con UDT.

Sin embargo, como su UDT es una colección, ¿intentó configurar la propiedad Size en param1?

param1.Size = row_ids.Length; 

Ahora bien, no es un UDT, pero aquí es un fragmento de código como me ato a un tipo definido en una especificación de paquete como:

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; 

No estoy seguro de qué valores puede establecer ArrayBindSize en.

Además, es posible considerar la creación de una fábrica de tipo para su UDT:

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

De todos modos, espero que encuentre algo aquí que ayuda.

Cuestiones relacionadas