使用循环将数据写入oracle数据库

时间:2016-03-17 10:48:11

标签: r

我能够在数据库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' 

这是第一行。

我在互联网上找不到有意义的信息,虽然我已经搜索了一周以上;有任何想法解决这个错误。提前谢谢。

1 个答案:

答案 0 :(得分:1)

对我而言,它有点令人惊讶,它不起作用,但是,使用您提供的代码重现它实际上相当容易。直到那一刻,每当我必须做类似的事情我已经使用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,< / p>

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(con@jc, "Z", "getAutoCommit")
[1] TRUE
.jcall(con@jc, "V", "setAutoCommit", FALSE)

但是你需要在你的循环之外提交,只需

dbCommit(con)

希望它有所帮助。