将数据插入Oracle表

时间:2018-10-19 04:44:12

标签: r database oracle

我对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中都是独立工作的。我究竟做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

dbGetQuerydbSendQuerydbSendUpdate调用中不支持多个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)