2010-11-24 1 views
5

Я пытаюсь вызвать процедуру, которая принимает пользовательский тип данных table of numbers как один из параметров.Неверное связывание для Oracle UDT в параметре процедуры

Вот определение типа:

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

EDIT: Май 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 является коллекцией, вы попытались установить свойство Size на param1?

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

Во всяком случае, я надеюсь, что вы найдете здесь что-то, что помогает.

Смежные вопросы