ODP .NET 获取 SYSREFCURSOR 输出。 {“不支持的列数据类型”}错误

发布于 2024-09-13 20:41:16 字数 1412 浏览 8 评论 0原文

我正在尝试执行一个返回存储过程的过程。我的 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 错误消息。

I am trying to execute a procedure that returns a stored procedure. My version of Oracle DB is 9.2 and the ODP .NET version is 10.2.0.100

My C# code looks like this.

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;

My Oracle Procedure code looks like this

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;

When I execute my code, the part where I attempt a GetReader() fails with an UNSUPPORTED COLUMN DATATYPE error message.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

勿挽旧人 2024-09-20 20:41:16

我相信您正在打开一个 refCursor 来保存来自 Dual 的 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 中的参数总是< /em> 期望函数返回值作为第一个参数。

I believe you are opening a refCursor to hold a Select [RefCursor] from dual

why don't you just

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;

or better yet just call getleaseheaderrows from the .net side and drop the procedure (just remember for parameters in ODP it always expects the function return value as the first param.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文