Неверное привязка для Oracle UDT в процедуре параметра
-
28-09-2019 - |
Вопрос
Я пытаюсь вызвать процедуру, которая принимает пользовательский тип данных 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 мая
Поскольку мой ответ недопустим, вот ссылка, которая может быть использования:
К сожалению, я не могу играть с этим, так как у меня есть 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.
Во всяком случае, я надеюсь, что вы найдете что-то здесь, что помогает.