Я пытаюсь использовать Arraybinding для загрузки нескольких строк в таблицу. Подход работает для встроенных запросов, но не тогда, когда выполняется через хранимую процедуру.
Я ожидаю, что возникнет исключительная ситуация с внутренним объектом Errors, заполненным номерами строк там, где произошел сбой.
Это пример с сайта Oracle, и он прекрасно работает для меня. Но как только я заменяю встроенный запрос хранимой процедурой, он завершается с единственной ошибкой и не содержит никакой информации для строки, которая завершилась неудачей.
https://docs.oracle.com/html/B14164_01/featOraCommand.htm#i1007888
/* Database Setup
drop table depttest;
create table depttest(deptno number(2));
*/
Это программа
using System;
using System.Data;
using Oracle.DataAccess.Client;
class ArrayBindExceptionSample
{
static void Main()
{
OracleConnection con = new OracleConnection();
con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle;";
con.Open();
OracleCommand cmd = new OracleCommand();
// Start a transaction
OracleTransaction txn = con.BeginTransaction(IsolationLevel.ReadCommitted);
try
{
int[] myArrayDeptNo = new int[3] { 10, 200000, 30 };
// int[] myArrayDeptNo = new int[3]{ 10,20,30};
// Set the command text on an OracleCommand object
cmd.CommandText = "insert into depttest(deptno) values (:deptno)";
cmd.Connection = con;
// Set the ArrayBindCount to indicate the number of values
cmd.ArrayBindCount = 3;
// Create a parameter for the array operations
OracleParameter prm = new OracleParameter("deptno", OracleDbType.Int32);
prm.Direction = ParameterDirection.Input;
prm.Value = myArrayDeptNo;
// Add the parameter to the parameter collection
cmd.Parameters.Add(prm);
// Execute the command
cmd.ExecuteNonQuery();
}
catch (OracleException e)
{
Console.WriteLine("OracleException {0} occured", e.Message);
if (e.Number == 24381)
for (int i = 0; i < e.Errors.Count; i++)
Console.WriteLine("Array Bind Error {0} occured at Row Number {1}",
e.Errors[i].Message, e.Errors[i].ArrayBindIndex);
txn.Commit();
}
cmd.Parameters.Clear();
cmd.CommandText = "select count(*) from depttest";
decimal rows = (decimal)cmd.ExecuteScalar();
Console.WriteLine("{0} row have been inserted", rows);
con.Close();
con.Dispose();
}
}
Заменить код хранимой процедурой
cmd.CommandText = "SPName";
cmd.CommandType = CommandType.StoredProcedure;
Хранимая процедура
PROCEDURE trial (p_deptno IN number)
AS
BEGIN
insert into ses.depttest(deptno) values (P_deptno);
END trial;