将 table 条记录从 Oracle 函数返回到 C# 应用程序

Returning a table of records from an Oracle function into a C# application

我们有一个 oracle 包,它 return 是一个 table 记录类型。定义是:

  TYPE t_daily_array_table IS TABLE OF r_daily_array_rec INDEX BY BINARY_INTEGER;

其中 r_daily_array_rec 是一个包含多个字段的记录。然后我们在包中有一个定义如下的函数:

FUNCTION f_daily_array_table
         (ip_contract_code IN contract.contract_code%TYPE)
RETURN t_daily_array_table
IS ...

这一切都有效。但是我想从我的 C# 应用程序中调用这个函数,我已经使用 2 个不同的 Oracle 客户端驱动程序(.NET OracleClient 和 Oracle 的 odp.net)尝试了大约一百种不同的变体,但我似乎无法找到一种让它发挥作用的方法。

我不想记录我尝试过的所有不同方式,但我使用 odp.net 驱动程序的最新迭代是这样的:

using (OracleConnection conn = new OracleConnection("Data Source=dbname;User Id=username;Password=password"))
{
    using (OracleCommand cmd = new OracleCommand("FEED_SCHEDULE_PKG.f_daily_array_table", conn))
    {
        cmd.BindByName = true;
        cmd.Parameters.Add("ip_contract_code", 77116);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        OracleParameter p = new OracleParameter("t_daily_array_table", OracleDbType.Varchar2);
        p.Direction = System.Data.ParameterDirection.ReturnValue;
        cmd.Parameters.Add(p);
        conn.Open();
        object ob = cmd.ExecuteNonQuery();
    }
}

我试过 SQL 语句的变体,例如:

select * from Table(FEED_SCHEDULE_PKG.f_daily_array_table(ip_contract_code)); 要么 begin FEED_SCHEDULE_PKG.f_daily_array_table(ip_contract_code); end;

我已经尝试 ExecuteNonQuery 使用 return 参数。我试过 ExecuteReader 变成 IDataReader。我已经尝试 'returnvalue' 作为 return 值参数名称。

我四处搜索并尝试了所有我能找到的东西。 None 的示例函数与我们的非常相似。就像我说的,我尝试了很多变体。我似乎无法找到正确的设置。

非常感谢您对此提供帮助。

您无法绑定到来自 ODP.NET 的 PL/SQL 条记录。但是,您可以使用匿名 PL/SQL 或存储过程包装器将其转换为另一种类型。这是一个解决方法的示例:

Using ODP.NET to get a RECORD from PL/SQL function, without touching PL/SQL code