Неверное привязка для Oracle UDT в процедуре параметра

StackOverflow https://stackoverflow.com/questions/4271605

Вопрос

Я пытаюсь вызвать процедуру, которая принимает пользовательский тип данных 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

Какие свойства я пропускаю в определении параметра?

Это было полезно?

Решение

Редактировать: 14 мая

Поскольку мой ответ недопустим, вот ссылка, которая может быть использования:

http://developergeeks.com/article/35/working-wither-defined-type-orcle-udt-and-custom-type-us-odp-net-11g.


К сожалению, я не могу играть с этим, так как у меня есть x64 odp.net, который не поддерживает UDT.

Однако, поскольку ваш UDT является коллекцией, вы пробовали настроить свойство размера на 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;

Я не уверен, какие ценности вы можете установить ArrayBindize на.

Кроме того, вы можете рассмотреть возможность создания набора типа для вашего UDT:

http://download.orcle.com/docs/html/e15167_01/featudts.htm.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top