试图插入数千行与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 exceeded或Unable 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。
出于好奇,不要使用'Roracle'软件包。在他们的博客[这里](https://blogs.oracle.com/R/entry/r_to_oracle_database_connectivity)中,Oracle做了一些基准测试。 – agstudy
感谢@agstudy为这个interessting的想法。以前不知道。将看看。 – user2161065