【问题标题】:Calling stored procedure with parameter TABLE OF INTEGER parameter使用参数 TABLE OF INTEGER 参数调用存储过程
【发布时间】: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


    【解决方案1】:

    很遗憾,Entity framework core 仍然不完全支持 Oracle 数据库,其中一个限制是自定义类型:

    局限 专门的团队已成功实施了大多数 功能支持实体框架功能 Oracle 服务器可以使用,但有一些限制 无法克服。

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

    Source

    【讨论】:

    • 绝对不清楚,这与哪个版本有关。第二?我现在正在使用 EfCore 5,但仍然无法确定它是否相关(给定的帖子是 2018 年的)。
    • 不幸的是,这总是相关的,Oracle 和 .Net 不能很好地结合在一起。但是当我写这个问题时,我使用的是 Ef core 2
    • 我使用了以下似乎工作顺利的方法:if (command.Parameters["PATH_LIST"].Value is OracleRefCursor oracleRefCursor) 如果 - 是,则从此光标读取...(PATH_LIST 是我的输出光标参数)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多