在ODP.net 12c版本2中没有关闭隐式ref-Cursors

时间:2015-07-09 18:14:27

标签: odp.net oracle12c ora-01000

我将.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的移植比在几乎所有地方添加输出参数更容易,但我不想摆脱连接池。

0 个答案:

没有答案