SWI-Prolog ODBC接口 - 游标数

时间:2015-11-03 01:48:35

标签: prolog odbc swi-prolog

我使用SWI-Prolog ODBC interface连接Oracle Xe 12.0数据库。重复使用系统后,我收到ORA-01000错误,"超过打开游标的最大数量&#34 ;;然后迫使我重新启动应用程序。

StackOverflow上有很多关于此错误的问题,但没有一个与SWI-Prolog ODBC接口有关。我使用代码(下面采样)进行了调查和测试,发现调用odbc_prepare/4然后调用odbc_execute/3 释放ODBC语句对象。

这是我跑的测试。连接后(使用适当的DSN,用户和密码):

:- odbc_connect(DSN,C,[user(USER),password(PASSWD),alias(swi),open(once)]).

我的测试谓词,其中' a_table'是数据库中的一个表,其中包含列' colname':

go_test(N):-
   N1 is N+1,
   write(N1),nl,
   odbc_prepare(swi,'select count(colname) from a_table',[],Statement),
   odbc_execute(Statement,[]),
   %(point of change)
   go_test(N1).

打印最多300次然后崩溃并出现错误(这正是我所期望的,因为在SQL Plus中运行select value from v$parameter where name = ‘open_cursors’;告诉我300)。

替换" %(变更点)"使用odbc_free_statement(Statement),go_test似乎无限期地运行。

然而,虽然(我),但我已在我的计划中将每个odbc_prepareodbc_executeodbc_free_statement配对;我仍然在(更多)使用后得到错误。还有什么可能导致这个"光标泄漏"?

我意识到我可以在SQL Plus中运行查询以尝试识别连接游标使用量的增加,但似乎很难在Prolog应用程序中与谓词调用协调。真正帮助我的是通过SWI-Prolog的ODBC接口查询当前连接使用的游标数量的方法。理想情况下,odbc_get_connection之类的东西可以做到;但properties没有一个是我正在寻找的。如何通过SWI-Prolog ODBC接口找出活动连接游标的数量?

0 个答案:

没有答案