2016-03-17 104 views
0

我能夠在數據庫中對r進行購物籃分析。 我已經完成了我的分析,我想將結果逐行寫入到oracle數據庫中。我已經試過這使用循環將數據寫入r中的oracle數據庫

sonuclar<-inspect(basket_rules[1:5]) 
mode(sonuclar) 
[1] "list" 
class(sonuclar) 
[1] "data.frame" 
for(row in 1:nrow(sonuclar)) {`dbGetQuery(jdbcConnection,paste0("insert into market_basket_analysis (lhs,rhs,support,confidence,lift) 
values ('",sonuclar$lhs[row],"','",sonuclar$rhs[row],"','",sonuclar$support[row],"','",sonuclar$confidence[row],"','",sonuclar$lift[row],"')"))}` 

,但它寫入了只有一行,它並不適用於其他循環迭代步工作,它返回一條錯誤消息:

`Error in .verify.JDBC.result(md, "Unable to retrieve JDBC result set meta data for ", : 
    Unable to retrieve JDBC result set meta data for insert into market_basket_analysis (lhs,rhs,support,confidence,lift) values ('{SPRITE GAZOZ1,5L}','{COCACOLA # 1,5LT}','0.00395004588437138','0.439024390243902','1.99010097534508') in dbSendQuery (ORA-00900: invalid SQL statement 
)` 

即使它給出了一個錯誤,它插入

{SPRITE GAZOZ1,5L},{COCACOLA # 1,5LT},'0.00395043993535644','0.439024390243902','1.98990246549237' 

這是第一行。

我還沒有在互聯網上找到有意義的信息,雖然我已經搜查了一個多星期;有任何想法解決這個錯誤。提前致謝。

回答

0

對我來說,它也有點令人驚訝,它沒有工作,但是,是的,它實際上很容易與你提供的代碼重現。直到現在,每當我不得不採取類似的做法時,我已經使用了dbWriteTable,不知道是否因爲任何原因無法做到這一點。

無論如何,如果你真的需要或想要插入一個循環,你應該使用綁定變量。你的循環應該是這樣的,

for(row in 1:nrow(sonuclar)) { 
inss <- paste0("insert into temp (lhs,rhs,support,confidence,lift) values (?, ?, ?, ?, ?)") 
dbSendUpdate(con, inss, list=as.list(sonuclar[row, ])) 
} 

(請注意,我的連接被稱爲con和表temp,而不是你的名字......),僅供參考,我已經定義了data.frame這樣,

sonuclar <- data.frame(matrix(c('{SPRITE GAZOZ1,5L}','{COCACOLA # 1,5LT}',0.00395004588437138,0.439024390243902,1.99010097534508, 
           '{SPRITE GAZOZ1,5L}','{COCACOLA # 1,5LT}',0.00395043993535644,0.439024390243902,1.98990246549237), 
           nrow=2, ncol=5, byrow=TRUE)) 
colnames(sonuclar) <- c('lhs','rhs','support','confidence','lift') 

,並在表中我使用varchar(20)lhsrhs,並number(10,4)爲其它列。

最後一點,我不知道你有多大的循環,但如果你禁用了autocommit(默認爲TRUE),

.jcall([email protected], "Z", "getAutoCommit") 
[1] TRUE 
.jcall([email protected], "V", "setAutoCommit", FALSE) 

但隨後你需要外界承諾會更好你的循環,只是

dbCommit(con) 

希望它有幫助。

+0

是的,它確實有幫助,非常感謝。起初我使用過[tag:dbWriteTable],但它返回了類似的錯誤。 – pcpcne

+0

謝謝,很高興它有用。對於我來說,使用'dbWriteTable'時它可以很好地處理簡單的示例數據框...但無論如何確實dbWriteTable有一些缺點,不允許你完全控制。 – lrnzcig