将Oracle函数中的记录表返回到C#应用程序中



我们有一个oracle包,它返回一个记录类型的表。定义是:

  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#应用程序调用这个函数,我已经尝试了大约一百种不同的变体,使用了两种不同的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。我已将ExecuteReader转换为IDataReader。我已尝试将"returnvalue"作为返回值参数名称。

我到处找,尽我所能。没有一个示例函数与我们的非常相似。就像我说的,我尝试了很多变化。我似乎无法找到正确的设置。

我真的很感谢你在这方面的帮助。

您无法从ODP.NET绑定到PL/SQL记录。但是,您可以使用匿名PL/SQL或存储过程包装将其转换为其他类型。这里有一个变通方法的例子:

使用ODP.NET从PL/SQL函数中获取RECORD,无需接触PL/SQL代码

相关内容

  • 没有找到相关文章

最新更新