我能够在数据库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 :(得分: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)
用于lhs
和rhs
,将number(10,4)
用于其他列。
最后一点,我不知道你的循环有多大,但如果你禁用autocommit
(默认情况下为TRUE)会更好,
.jcall(con@jc, "Z", "getAutoCommit")
[1] TRUE
.jcall(con@jc, "V", "setAutoCommit", FALSE)
但是你需要在你的循环之外提交,只需
dbCommit(con)
希望它有所帮助。