Как передать массив байтовых массивов, используя ODP.Net? - PullRequest
2 голосов
/ 03 декабря 2011

Я пытаюсь передать массив байтовых массивов (byte [] []) в процедуру Oracle, используя ODP.Net, который с точки зрения Oracle является массивом Raw.Я получаю следующее исключение:

Oracle.DataAccess.Client.OracleException не было обработано кодом пользователя. Message = ORA-06550: строка 1, столбец 52: PLS-00418: тип привязки массива должен соответствовать строке таблицы PL / SQLтип ORA-06550: строка 1, столбец 7: PL / SQL: оператор игнорируется Источник = поставщик данных Oracle для .NET ErrorCode = -2147467259

Я передаю строковые массивы в процедуры Oracle без каких-либо проблем, но массивбайтовых массивов является проблемой.Вот мой код c #, передающий байт [] [] в процедуру:

conn = new OracleConnection(tm_connectStr);

saveAnswers = new OracleCommand(commandName, conn);
saveAnswers.CommandType = CommandType.StoredProcedure;

// Input params
//byte array of hashed answers.
byte[][] answers = userAnswers.Select(a => a.Answer).ToArray<byte[]>(); //a.Answer is already a byte array.
OracleParameter pAnswers = saveAnswers.Parameters.Add("p_answers_tab", OracleDbType.Raw,     ParameterDirection.Input);
pAnswers.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
pAnswers.Value = answers;
pAnswers.Size = answers.Length;

if (conn.State != ConnectionState.Open) conn.Open();

saveAnswers.ExecuteNonQuery(); //This line throws exception.

Процедура Oracle:

PROCEDURE create_answers(
p_answers_tab IN g_param_raw_tab_type
) IS
BEGIN
FOR i IN p_answers_tab.FIRST .. p_answers_tab.LAST LOOP
INSERT INTO answers
(
answer,
created_ts
)
VALUES (
p_answers_tab( i ),
SYSTIMESTAMP
);
END LOOP;
END create_answers;

И структура таблицы:

Table name: Anwers

1) Coulmn name: anwer, Data type: Raw
2) Coulmn name: created_ts, Data type: Timestamp(6)

Любое понимание очень ценится.

1 Ответ

1 голос
/ 06 декабря 2011

Приведенный выше код в порядке и может использоваться как есть для передачи массива байтового массива в Oracle SP. Здесь был сбой ... После долгого обхода куста программист БД, работающий с типом "g_param_raw_tab_type", обнаружил, что тип был непреднамеренно сделан как массив varchar вместо Raw.Тип был изменен на Raw и BINGO !!!!звонок прошел.

...