【发布时间】:2020-10-21 22:43:01
【问题描述】:
我很难使用有史以来兼容性最差的数据库引擎,也就是 Oracle。
我有这个自定义类型:
CREATE OR REPLACE TYPE INTEGERS_ARRAY AS TABLE OF INTEGER;
还有这个简单的存储过程:
CREATE OR REPLACE PROCEDURE TEST_PROCEDURE_MAHMOUD(
holy_array IN INTEGERS_ARRAY,
some_kind_of_number1 IN NUMBER,
some_kind_of_number2 IN NUMBER,
query_result OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN query_result FOR
SELECT CODE,AIRWAYBILL_DATE,REFERENCE1,REFERENCE2 FROM SHIPMENTS
ORDER BY AIRWAYBILL_DATE DESC
FETCH NEXT 10 ROWS ONLY;
end;
这个存储过程是另一个非常复杂的过程的简化版本,它也不起作用。我对两者都有相同的例外:
Oracle.ManagedDataAccess.Client.OracleException
ORA-06550:第 1 行,第 7 列:
PLS-00306:调用“TEST_PROCEDURE_MAHMOUD”时参数的数量或类型错误
ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略
这是我在 C# 中尝试做的:
var result = new List<string>();
using(var con = new OracleConnection(connectionString))
{
using(var command = con.CreateCommand())
{
con.Open();
command.CommandText = "TEST_PROCEDURE_MAHMOUD";
command.CommandType = System.Data.CommandType.StoredProcedure;
// Parameters
var array = new OracleParameter("holy_array", OracleDbType.Int64, ParameterDirection.Input);
array.UdtTypeName = "MY_SCHEMA.INTEGERS_ARRAY";
array.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
array.Size = 100;
array.Value = new int[] { 100, 101 };
var number1 = new OracleParameter("some_kind_of_number1", OracleDbType.Int64, 1, ParameterDirection.Input);
var number2 = new OracleParameter("some_kind_of_number2", OracleDbType.Int64, 1, ParameterDirection.Input);
var cursor = new OracleParameter("query_result", OracleDbType.RefCursor, ParameterDirection.Output);
command.Parameters.AddRange(new[] { array, number1, number2, cursor });
var reader = command.ExecuteReader();
while (reader.Read())
{
var awb = reader.GetString(0);
result.Add(awb);
}
}
}
return result;
Oracle 不应该理解非常简单的(整数表)类型并接受该类型的整数数组吗?我怎么解决这个问题?我浏览了官方网站上的文档,我阅读了 GitHub 上的代码示例,我搜索了很多,但找不到任何工作示例,只有解决方案,例如创建我不想做的临时表。
提前致谢。
编辑:Entity Framework Core 标记是因为我首先尝试使用 EF Core 执行此操作,但没有成功,我切换到 ADO.NET,认为这可能是 EF Core 的问题。但事实证明,EF Core 太好了,不能让我这么失望。
【问题讨论】:
标签: c# .net-core entity-framework-core ado.net oracle18c