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

时间:2015-03-25 20:58:47

标签: c# oracle odp.net system.data.oracleclient

我们有一个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#应用​​程序中调用此函数,并且我使用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;

我尝试使用return参数ExecuteNonQuery。我已经ExecuteReader尝试了IDataReader。我已经尝试'returnvalue'作为返回值参数名称。

我四处搜寻并尝试了我能找到的一切。这些示例函数都不像我们的。就像我说的,我尝试了很多变化。我似乎无法找到正确的设置。

我真的很感激你的帮助。

1 个答案:

答案 0 :(得分:0)

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

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