2014-02-06 34 views
1

试图插入数千行与R/RJDBC时,我遇到了一个错误,在Oracle数据库上的dbSendUpdate命令。R和RJDBC:使用dbSendUpdate导致ORA-01000:最大打开的游标超出

问题可以通过用

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)) 
} 

在搜索因特网提供的信息被再现,即一个应关闭结果游标,是显而易见的(例如,参见java.sql.SQLException: - ORA-01000: maximum open cursors exceededUnable to resolve error - java.sql.SQLException: ORA-01000: maximum open cursors exceeded)。

对于所有不使用游标结果索赔??dbSendUpdate帮助文件:

..这dbSendUpdate用于与DBML查询,因此不返回任何结果集。

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

任何人可以帮助

感谢,很多

PS:?!找到东西的RJDBC文档中interessting http://www.rforge.net/RJDBC/

请注意,连接,结果集,驱动程序等的生存时间由lifeti我相应的R对象。一旦R句柄超出范围(或者如果被rm明确地移除)并且在R中被垃圾收集,则关闭并释放相应的连接或结果集。这对资源有限的数据库(如Oracle)很重要 - 如果可能有许多打开的对象,则可能需要手动添加gc()以强制进行垃圾回收。即使在相应的R对象被释放之后,唯一的例外是在JDBC中保持注册的驱动程序,因为目前无法卸载JDBC驱动程序(在RJDBC中)。

但同样,甚至将gc()内环路将产生相同beahvoir。

+1

出于好奇,不要使用'Roracle'软件包。在他们的博客[这里](https://blogs.oracle.com/R/entry/r_to_oracle_database_connectivity)中,Oracle做了一些基准测试。 – agstudy

+0

感谢@agstudy为这个interessting的想法。以前不知道。将看看。 – user2161065

回答

相关问题