我们有一个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'作为返回值参数名称。
我四处搜寻并尝试了我能找到的一切。这些示例函数都不像我们的。就像我说的,我尝试了很多变化。我似乎无法找到正确的设置。
我真的很感激你的帮助。
答案 0 :(得分:0)
您无法从ODP.NET绑定到PL / SQL记录。但是,您可以使用匿名PL / SQL或存储过程包装器将其转换为另一种类型。以下是变通方法的一个示例:
Using ODP.NET to get a RECORD from PL/SQL function, without touching PL/SQL code