C# 使用整型参数的参数表调用存储过程

C# 使用整型参数的参数表调用存储过程,c#,.net-core,entity-framework-core,ado.net,oracle18c,C#,.net Core,Entity Framework Core,Ado.net,Oracle18c,我对有史以来兼容性最差的数据库引擎(又称甲骨文)很不满意 我有这个自定义类型: 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

我对有史以来兼容性最差的数据库引擎(又称甲骨文)很不满意

我有这个自定义类型:

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=newlist();
使用(var con=新的OracleConnection(connectionString))
{
使用(var command=con.CreateCommand())
{
con.Open();
command.CommandText=“测试程序”MAHMOUD;
command.CommandType=System.Data.CommandType.StoredProcess;
//参数
var数组=新的OracleParameter(“holy_数组”,OracleDbType.Int64,ParameterDirection.Input);
array.UdtTypeName=“MY\u SCHEMA.INTEGERS\u array”;
array.CollectionType=oraclecolectiontype.plsqlassociationarray;
数组。大小=100;
Value=newint[]{100101};
var number1=新的OracleParameter(“一些类型的”OracleDbType.Int64,1,ParameterDirection.Input);
var number2=新的OracleParameter(“某种类型的”OracleDbType.Int64,1,ParameterDirection.Input);
var cursor=新的OracleParameter(“查询结果”,OracleDbType.RefCursor,ParameterDirection.Output);
AddRange(新[]{array,number1,number2,cursor});
var reader=command.ExecuteReader();
while(reader.Read())
{
var awb=reader.GetString(0);
结果。添加(awb);
}
}
}
返回结果;
Oracle不应该理解非常简单的(整数表)类型并接受该类型的整数数组吗?我怎样才能解决这个问题?我浏览了官方网站上的文档,阅读了GitHub上的代码示例,我搜索了很多,没有找到任何工作示例,只是解决了一些问题,比如创建临时表,我不想这样做

提前谢谢


编辑:EntityFrameworkCore标签是因为我尝试先用EF Core来做这个,但没有成功,我切换到ADO.NET,认为这可能是EF Core的问题。但事实证明,EF Core太好了,不能像这样让我失望。

不幸的是,Entity framework Core仍然不能完全支持Oracle数据库,其中一个限制是自定义类型:

专业团队已成功实施了大多数限制 特性尽可能支持实体框架功能 对于Oracle Server,这是可能的,但存在一些限制 无法克服

Oracle没有对应的SQL Server外部应用程序和 交叉应用结构。用户定义的类型,包括Oracle 不支持对象、数组类型和嵌套表

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;