Пример привязки к массиву с использованием C # Oracle, управляемого данных и хранимых процедур - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...