2014-02-06 35 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

回答

相關問題