我想使用DBI
包将 Dataframe 从R写入Oracle SQL数据库。我可以用RODBC
包成功地做到这一点,但我希望能够用DBI
包纠正这个错误。
我得到的错误是Error: Not compatible with requested type: [type=character; target=double].
(见下文)
CODE using DBI::dbWriteTable()- Error with this
# data frame in R, use mtcars
data("mtcars")
# connect to Oracle database
STG <- DBI::dbConnect(odbc::odbc(), dsn="XXX", uid="XX", pwd="XXXXX")
# write table to SQL database
DBI::dbWriteTable(STG, name = "DBM_TEST", value = mtcars[1:5, ], overwrite = TRUE)
# disconnect
DBI::dbDisconnect(STG)
使用DBI::dbWriteTable()进行OUTPUT- * 错误 *
> data(mtcars)
> STG <- DBI::dbConnect(odbc::odbc(), dsn = "XXX", uid = "XX",
+ pwd = "XXXXX")
> DBI::dbWriteTable(STG, name = "DBM_TEST", value = mtcars[1:5, ], overwrite = TRUE)
Error: Not compatible with requested type: [type=character; target=double].
在这里,创建了Oracle DB中的表,但它始终为空。
CODE using RODBC::sqlSave()-工作正常,但我希望DBI工作
library(RODBC)
# connection to STG in UWDB
STG <- odbcConnect("XXX", uid="XXX", pwd="XXXXX")
# write table
try(sqlDrop(STG, 'DBM_TEST', errors = FALSE), silent = TRUE)
sqlSave(STG, mtcars, 'DBM_TEST', rownames = 'INDEX', addPK = TRUE, safer = FALSE)
# check table output from DB
sqlFetch(STG, "DBM_TEST", max = 5)
# disconnect
odbcClose(STG)
使用RODBC::sqlSave()输出
> data(mtcars)
> STG <- odbcConnect("XXX", uid="XXX", pwd="XXXXX")
> try(sqlDrop(STG, 'DBM_TEST', errors = FALSE), silent = TRUE)
> sqlSave(STG, mtcars, 'DBM_TEST', rownames = 'INDEX', addPK = TRUE, safer = FALSE)
> sqlFetch(STG, "DBM_TEST", max = 5)
INDEX mpg cyl disp hp drat wt qsec vs am gear carb
1 Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
4 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
5 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
> odbcClose(STG)
我尝试指定自己的field.types(dbWriteTable()中的参数),并查看了自动输入dbWriteTable()的SQL数据类型转换。
> DBI::dbDataType(STG, mtcars)
mpg cyl disp hp drat wt qsec vs am
"BINARY_DOUBLE" "BINARY_DOUBLE" "BINARY_DOUBLE" "BINARY_DOUBLE" "BINARY_DOUBLE" "BINARY_DOUBLE" "BINARY_DOUBLE" "BINARY_DOUBLE" "BINARY_DOUBLE"
gear carb
"BINARY_DOUBLE" "BINARY_DOUBLE"
我已经尝试了许多不同的 Dataframe ,包括一个只有整数的简单 Dataframe 。我已经研究过这个错误,但在这种情况下似乎找不出来。
这些表是在Oracle DB中创建的,但从不填充数据。
在此先谢谢您!
1条答案
按热度按时间tgabmvqs1#
我在大约一个月前更新软件包后遇到了这个问题。今天,我就来看看这一点,这一点,是我的责任。1.3.5从2023-06-29更新。
尝试通过
remotes::install_version("odbc", "1.3.4")
恢复到1.3.4,直到这个问题在下一个{odbc}更新中得到解决(希望如此)。