如何使用ODP.Net传递字节数组数组

本文关键字:数组 字节 字节数 何使用 ODP Net | 更新日期: 2023-09-27 18:16:26

我试图通过一个字节数组数组(byte[][])到Oracle过程使用ODP。Net,从Oracle的角度来看,它是一个Raw。我得到以下异常:

Oracle.DataAccess.Client。OracleException未被用户代码处理消息=ORA-06550:第1行,第52列:PL -00418:数组绑定类型必须匹配PL/SQL表的行类型ORA-06550:第1行,第7列PL/SQL:语句被忽略源= .NET的Oracle数据提供程序ErrorCode = -2147467259

我将字符串数组传递给Oracle过程没有任何问题,但字节数组的数组是一个问题。下面是我的c#代码,将byte[][]传递给过程:

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)

如何使用ODP.Net传递字节数组数组

以上代码都很好,可以原样用于将字节数组的数组传递给Oracle sp。这里是故障…在绕了很长一段时间之后,处理"g_param_raw_tab_type"类型的DB程序员发现,该类型无意中变成了一个varchar数组,而不是Raw数组。类型更改为Raw和BINGO!!!!电话接通。