我将.net应用程序从SqlServer移植到Oracle 12c。 我使用非托管的64位ODAC 12c Release 2(12.1.0.1.2)客户端访问数据库。
Oracle 12c引入了DBMS_SQL.RETURN_RESULT(cur)函数,该函数允许我按原样重用.net代码,而无需向ado.net命令添加特定的输出参数。 这是我的代码的代码片段:
PROCEDURE uspGetAllNumericUnits_RPT
AS
cv_1 SYS_REFCURSOR;
BEGIN
OPEN cv_1 FOR
SELECT * FROM NumericUnit;
DBMS_SQL.RETURN_RESULT(cv_1);
END;
uspGetAllNumericUnits存储过程就像:
{{1}}
我相信我正确处理了dbReader和dbCommand,连接也被connectionScope关闭和处理。 但是,如果我检查服务器上的v $ open_cursor视图,我会看到一个游标,用于" SELECT * FROM NumericUnit;"仍然开放。 我使用连接池,如果我禁用它(我不想这样做),当connectionScope被释放时,光标会被正确关闭。
我的问题是我有很多像这样的ado.net调用,我很快达到了每个会话的最大允许游标限制,并且引发了ORA-01000错误。
如果我使用旧的Oracle 11g方法,将结果集游标作为输出参数返回而不使用DBMS_SQL.RETURN_RESULT(cv_1)函数,则无论是否连接池,都会在放置connectionScope时正确关闭游标。
我需要一些额外的对象来处理隐藏的ref-cursors吗?这是一个已知的ODAC 12cR2错误吗? DBMS_SQL.RETURN_RESULT(cv_1)的引入使得从SqlServer到Oracle的移植比在几乎所有地方添加输出参数更容易,但我不想摆脱连接池。