我对R非常陌生,因此请原谅任何明显或天真的错误。我需要将R中的多行数据插入到Oracle数据库表中。
制作数据帧(我在脚本的前面已经建立了RJDBC连接):
df <- data.frame("field_1" = 1:2, "field_2" = c("f","k"), "field_3"= c("j","t"))
此代码运行无错误,但仅将第一行插入到表中:
insert <- sprintf("insert into temp_r_test_u_suck values (%s')",
apply(df, 1, function(i) gsub(" ", "", paste("'", i, collapse="',"), fixed = TRUE)))
dbSendUpdate(con, insert)
此代码运行:
insert <- sprintf("into temp_r_test_u_suck values (%s')",
apply(df, 1, function(i) gsub(" ", "", paste("'", i, collapse="',"), fixed = TRUE)))
insert_all <- c("insert all", insert, "select * from dual")
dbSendUpdate(con, insert_all)
但是给我这个错误:
Error in .local(conn, statement, ...) :
execute JDBC update query failed in dbSendUpdate (ORA-00905: missing keyword
这两个查询在Oracle中都是独立工作的。我究竟做错了什么?
谢谢!
答案 0 :(得分:0)
dbGetQuery
,dbSendQuery
,dbSendUpdate
调用中不支持多个SQL语句。您需要为每个语句遍历它们。因此,为什么只执行第一个语句。要解决此问题,请扩展apply
内部的匿名函数以调用dbSendUpdate
:
apply(df, 1, function(i) {
# BUILD SQL STATEMENT
insert <- sprintf("insert into temp_r_test_u_suck values (%s')",
paste0("'", i, collapse="',"))
# RUN QUERY
dbSendUpdate(con, insert)
})
但是,RJDBC通过使用rForge docs中提到的dbSendUpdate
支持参数化扩展了DBI标准,无需批量连接字符串。
dbSendUpdate(conn,statement,...)
该函数类似于 dbSendQuery,但可用于DBML语句,因此不会返回 结果集。它比dbSendQuery更有效。此外,截至 RJDBC 0.2-9,它在准备好的语句中支持向量,从而允许 批量插入。
# ALL CHARACTER DATAFRAME
df <- data.frame(field_1=as.character(1:2), field_2=c("f","k"), field_3=c("j","t"),
stringsAsFactors=FALSE)
# PREPARED STATEMENT
sql <- "insert into temp_r_test_u_suck values (?, ?, ?)"
# RUN QUERY
dbSendUpdate(con, sql, df$field_1, df$field_2, df$field_3)