将 R Dataframe 中的多行插入 Oracle 数据库

2023-12-30

我有例如数据框:

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

现在我想将此数据框写入 Oracle 数据库不使用 sqlSave因为我有一个巨大的 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 https://stackoverflow.com/questions/14334840/how-to-insert-a-dataframe-into-a-sql-server-table帖子,但它对我不起作用。

最佳的做法是什么?我想要传递的字符串应该是什么样子?提前致谢。


假设 R 数据帧列与 Oracle 中的列完全相同且顺序相同(不多或更少),请考虑apply to paste with collapse每行中的所有值:

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 https://cran.rstudio.com/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html您只需传入原始数据帧而无需循环:

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 R Dataframe 中的多行插入 Oracle 数据库 的相关文章

随机推荐