R和RJDBC:使用DBSENDUPDATE在ORA-01000中结果:超过最大开放光标



我在尝试使用 r/rjdbc dbSendUpdate 令插入数千行时遇到了错误。

可以通过使用

创建测试表来复制问题
CREATE TABLE mytest (ID NUMBER(10) not null);

然后执行以下R脚本

library(RJDBC)
drv<-JDBC("oracle.jdbc.OracleDriver","ojdbc-11.1.0.7.0.jar") # place your JDBC driver here
conn <- dbConnect(drv, "jdbc:oracle:thin:@MYSERVICE", "myuser", "mypasswd") # place your connection details here
for (i in 1:10000) {
  dbSendUpdate(conn,"INSERT INTO mytest VALUES (?)",i))
}

搜索Internet提供了信息,该信息应关闭结果光标,这是显而易见的(例如,请参见Java.sql.sqlexception: - ORA -01000:最大开放光标超出或无法解决错误或无法解决错误-Java.SQL.SQLEXCEPTION:SQL.SQLEXCEPTION:ORA-01000:超过最大开放光标)。

但是 ??dbSendUpdate的帮助文件完全不使用结果光标:

..该dbsendupdate与dbml查询一起使用,因此不会返回任何结果集。

因此,这种行为对我没有多大意义: - (

任何人都可以帮助吗?

谢谢,很多!

ps:在RJDBC文档中找到了一些东西http://www.rforge.net/rjdbc/

请注意,连接,结果集,驱动程序等的寿命由相应R对象的寿命确定。一旦R句柄脱离范围(或者通过RM明确删除)并在R中收集垃圾,则将相应的连接或结果集封闭并释放。这对于资源有限(例如Oracle)的数据库很重要 - 如果可能有许多开放对象,则可能需要手工添加GC()来强制垃圾收集。唯一的例外是即使在释放相应的R对象之后仍在JDBC注册的驱动程序,因为当前没有办法卸载JDBC驱动程序(在RJDBC中)。

,但再次,即使在循环中插入gc()也会产生相同的beahvoir。

最后,我们意识到软件包rjdbc中的 bug 。如果您愿意修补RJDBC,则可以在https://github.com/starfox899/rjdbc上使用可用的修补源(只要它们未导入到软件包中)。

相关内容

  • 没有找到相关文章

最新更新