我正在尝试执行一个返回存储过程的过程。我的Oracle DB版本是9.2,ODP .NET版本是10.2.0.100
我的C#代码看起来像这样。
OracleCommand od = new OracleCommand();
od.Connection = oc;
OracleParameter opBranchNo;
OracleParameter opSysRef;
od.CommandType = System.Data.CommandType.StoredProcedure;
od.CommandText = "pkg_fetchleaseinfo.proc_fetchleaseheader";
opBranchNo = new OracleParameter("IBRANCH_ID", OracleDbType.Varchar2, 3, "044");
opBranchNo.Direction = System.Data.ParameterDirection.Input;
od.Parameters.Add(opBranchNo);
opSysRef = new OracleParameter();
opSysRef.ParameterName = "REC_SET";
opSysRef.Direction = System.Data.ParameterDirection.Output;
opSysRef.OracleDbType = OracleDbType.RefCursor;
od.Parameters.Add(opSysRef);
od.Prepare();
od.ExecuteNonQuery();
Oracle.DataAccess.Types.OracleRefCursor sysref =
(Oracle.DataAccess.Types.OracleRefCursor)opSysRef.Value;
return sysref.GetDataReader();
//OracleDataReader dr1 =
//((Oracle.DataAccess.Types.OracleRefCursor)opSysRef.Value).GetDataReader();
//return dr1;
我的Oracle程序代码如下所示
PROCEDURE proc_fetchleaseheader(ibranch_id IN VARCHAR2,
rec_set OUT SYS_REFCURSOR) IS x_rec genericCursor;
BEGIN
OPEN x_rec FOR SELECT getleaseheaderrows(ibranch_id) FROM dual;
rec_set := x_rec;
EXCEPTION WHEN OTHERS THEN
RAISE;
END;
当我执行我的代码时,我尝试GetReader()的部分失败并显示UNSUPPORTED COLUMN DATATYPE错误消息。
答案 0 :(得分:1)
我相信你正在打开一个refCursor,以便从双
中持有Select [RefCursor]你为什么不
PROCEDURE proc_fetchleaseheader(ibranch_id IN VARCHAR2,
rec_set OUT SYS_REFCURSOR) IS x_rec genericCursor;
BEGIN
x_rec := getleaseheaderrows(ibranch_id);
rec_set := x_rec;
/**EXCEPTION WHEN OTHERS THEN --no need for this, the proc will raise just fine without being explicitly told to do so
RAISE;
***/
END;
或更好但只是从.net端调用getleaseheaderrows并删除该过程(只记得ODP中的参数总是期望函数返回值作为第一个参数。