将 R Dataframe 中的多行插入 Oracle 数据库
Posted
技术标签:
【中文标题】将 R Dataframe 中的多行插入 Oracle 数据库【英文标题】:Insert multiple rows from R Dataframe into Oracle Database 【发布时间】:2017-06-12 14:57:12 【问题描述】:我有例如数据框:
df <- as.data.frame(matrix(sample(c(NA, 1:50), 49, replace = TRUE), 7))
看起来像这样:
V1 V2 V3 V4 V5 V6 V7
1 46 6 23 7 22 42 1
2 47 33 47 50 42 NA 49
3 14 35 49 48 37 10 22
4 42 23 5 4 41 46 48
5 32 36 24 26 19 31 45
6 26 47 28 19 34 19 32
7 37 13 46 46 NA 22 49
现在我想在不使用 sqlSave 的情况下将此数据帧写入 oracle 数据库,因为我有一个巨大的 data.frame,如果我这样做,R Studio 会崩溃。相反,我决定使用 sqlQuery:
library(RODBC)
connHandle <- odbcConnect("DBName", uid="user", pwd="password")
sqlQuery(connHandle, sprintf("INSERT INTO MYTABLE VALUES %s", stringWithMyDataframeValues))
close(connHandle)
我已阅读 this 的帖子,但它对我不起作用。
最好的方法是什么?我想要传递的字符串应该是什么样子?提前致谢。
【问题讨论】:
【参考方案1】:假设 R 数据框列是完全相同的列并且在 Oracle 中以相同的顺序(不多或少),考虑apply
到paste
折叠每行中的所有值:
sqls <- sprintf("INSERT INTO MYTABLE VALUES (%s)",
apply(df, 1, function(i) paste(i, collapse=",")))
sqls
# [1] "INSERT INTO MYTABLE VALUES (2,10,9,50,34,37,29)"
# [2] "INSERT INTO MYTABLE VALUES (7,24,33,21,21,20,3)"
# [3] "INSERT INTO MYTABLE VALUES (39,38,2,33,43,33,7)"
# [4] "INSERT INTO MYTABLE VALUES (30,11,33,1,29,26,11)"
# [5] "INSERT INTO MYTABLE VALUES (50,45,13,27,3,35,36)"
# [6] "INSERT INTO MYTABLE VALUES (41,5,39,17,5,22,5)"
# [7] "INSERT INTO MYTABLE VALUES (21,50,39,30,2,11,49)"
# RECOMMENDED APPROACH TO SPECIFY COLUMNS
sqls <- sprintf("INSERT INTO MYTABLE (Col1, Col2, Col3, Col4, Col5, Col6, Col7) VALUES (%s)",
apply(df, 1, function(i) paste(i, collapse=",")))
connHandle <- odbcConnect("DBName", uid="user", pwd="password")
lapply(sqls, function(s) sqlQuery(connHandle, s))
close(connHandle)
更好的方法是使用带有RODBCext
的参数化,您只需传入原始数据帧而无需循环:
library(RODBCext)
connHandle <- odbcConnect("DBName", uid="user", pwd="password")
query <- "INSERT INTO MYTABLE (Col1, Col2, Col3, Col4, Col5, Col6, Col7) VALUES (?, ?, ?, ?, ?, ?, ?)"
sqlExecute(connHandle, query, df)
odbcClose(connHandle)
【讨论】:
您的解决方案对我来说效果很好,但lapply
需要花费大量时间来上传包含 190 万行数据的数据框。您对此有其他解决方案吗?
考虑将数据从 R 导出到 csv/txt,然后使用 Oracle SQL*Loader 工具导入。
是的,遇到了LOAD DATA
,我正在尝试但遇到错误。
它不是 mysql 中的 SQL 命令,而是 Oracle 的命令行实用程序,不能使用 RODBC 运行。进一步阅读并提出一个单独的问题。祝你好运!
@user11397513,.是的,这可能发生。这个问题已经超过3年了。但是您始终可以从Git sources 安装软件包。顺便说一句,考虑升级到 R 4.0+。以上是关于将 R Dataframe 中的多行插入 Oracle 数据库的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中为 DataFrame 中的每一行返回多行
使用控制器中的 prepareStatement 向表中插入多行失败