我们有一个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代码