Я пытаюсь передать параметр в хранимую процедуру, используя пакет Oracle.EntityFrameworkCore
, например:
DataTable table = new DataTable();
table.Columns.Add("keyColumn", typeof(string));
table.Columns.Add("valueColumn", typeof(string));
var row = table.NewRow();
row.ItemArray = new object[]
{
entry.KeyColumn,
entry.ValueColumn
};
table.Rows.Add(row);
var parameter = new OracleParameter("entries",table);
parameter.UdtTypeName = "entry_type_list";
return context.Database.ExecuteSqlCommandAsync(
new RawSqlString( @"EXEC set_entry_list (:entries)" ),
parameter);
Хранимая процедура и тип определяются следующим образом:
CREATE OR REPLACE TYPE entry_type AS OBJECT
(
"keyColumn" NVARCHAR2(3),
"valueColumn" NVARCHAR2(3)
);
CREATE OR REPLACE TYPE entry_type_list AS TABLE OF entry_type;
CREATE OR REPLACE PROCEDURE set_entry_list (entries entry_type_list) AS
BEGIN
REM Doing stuff
END;
Но я получаю сообщение об ошибке:
System.ArgumentException: значение не попадает в ожидаемый диапазон.
в Oracle.ManagedDataAccess.Client.OracleParameter..ctor (String параметрName, Object obj)
Единственным источником для этого является ответ как это сделать с SQL Server, но нет ответа для Oracle с EFCore. Проблема здесь заключается в том, что Oracle принимает OracleParameter
, тогда как другие используют SqlParameter
.
Если я использую тип SqlParameter
следующим образом:
var parameter = new SqlParameter("entries", SqlDbType.Structured);
parameter.TypeName = "entry_type_list";
parameter.Value = table;
Я получаю эту ошибку:
System.InvalidCastException: Невозможно привести объект типа'System.Data.SqlClient.SqlParameter' для ввода 'Oracle.ManagedDataAccess.Client.OracleParameter'.
Я также пытался установить parameter.OracleDbType
для различных значений, таких как Blob
, RefCursor
,Clob
или XmlType
, установка parameter.DbType
на Object
или установка CollectionType
на PLSQLAssociativeArray
безуспешно. Кроме того, передача таблицы или массива объектов вместо таблицы не удалась.
В настоящее время я понятия не имею, что еще можно попробовать.
Любой метод для передачи большого количества объектов вхранимая процедура в быстром виде поможет. Я использую их с командой слияния, поэтому мне нужно иметь возможность преобразовать эти параметры в таблицу.