在我的数据库中,我有一个存储过程,其OUTPUT参数类型为SYS_REFCURSOR。应用程序方面是在C#中使用的。我可以将此过程的输出参数分配给Datatable,如:
.............
OracleConnection con=new OracleConnection(......);
OracleCommand cmd=new OracleCommand("MyStoredProc",con);
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add("REC_CUR",OracleType.Cursor).Direction=ParameterDirection.Output;
con.Open();
cmd.ExecuteNonQuery();
DataTable dt=(DataTable)cmd.Parameters["REC_CUR"].value;//is this legal?
答案 0 :(得分:2)
这是我自己的问题的答案。如果存储过程的输出参数是SYS_REFCURSOR类型,那么命令
cmd.Parameters["REC_CUR"].value
将返回OracleDataReader对象,而不是表。从OracledataReader到DataTable没有隐式或非显式的演员。
答案 1 :(得分:1)
您可以使用下面的OracleDataAdapter
带有RefCursor
的多个输出参数的示例代码:
using (OracleCommand cmd = new OracleCommand("SP1", OraCon) { CommandType = System.Data.CommandType.StoredProcedure })
{
var parm_nic = cmd.Parameters.Add("parm_nic", OracleDbType.NVarchar2);
parm_nic.Value = msgBody;
var pram_Name = cmd.Parameters.Add("pram_Name", OracleDbType.NVarchar2, 150, ParameterDirection.Output);
var pram_PAdress = cmd.Parameters.Add("pram_PAdress", OracleDbType.NVarchar2, 150, ParameterDirection.Output);
var output = cmd.Parameters.Add("pram_status", OracleDbType.RefCursor, ParameterDirection.Output);
OraCon.Open();
OracleDataAdapter ad = new OracleDataAdapter(cmd);
OracleCommandBuilder cb = new OracleCommandBuilder(ad);
DataTable dt = new DataTable();
ad.Fill(dt);
var address = pram_PAdress.Value;
var name = pram_Name.Value;
}