1

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

  TYPE t_daily_array_table IS TABLE OF r_daily_array_rec INDEX BY BINARY_INTEGER;

wherer_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返回参数。我试过ExecuteReader进入IDataReader. 我已经为返回值参数名称尝试了“returnvalue”。

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

我真的很感激这方面的一些帮助。

4

1 回答 1

1

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

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

于 2015-03-26T16:22:41.520 回答