提问人:danadbm 提问时间:8/14/2023 最后编辑:Laureldanadbm 更新时间:9/12/2023 访问量:218
将 R 数据帧写入 Oracle SQL 数据库时出现 R DBI dbWriteTable“与请求的类型不兼容”错误
R DBI dbWriteTable "Not compatible with requested type" error when writing R data frame to Oracle SQL database
问:
我想使用该包将数据帧从 R 写入 Oracle SQL 数据库。我能够使用软件包成功执行此操作,但我希望能够使用软件包更正此错误。DBI
RODBC
DBI
我得到的错误是(见下文)Error: Not compatible with requested type: [type=character; target=double].
使用 DBI::d bWriteTable() 的 CODE - 错误
# 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::d bWriteTable() 的输出 - 错误
> 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 数据库中的表,但它始终为空。
使用 RODBC::sqlSave() 的 CODE - 工作正常,但我希望 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"
我尝试了许多不同的数据帧,包括一个只有整数的简单数据帧。 我已经研究了这个错误,但在这种情况下似乎无法弄清楚。
这些表是在 Oracle DB 中创建的,但从未填充过数据。
先谢谢你!
答:
2赞
alaskayo
9/6/2023
#1
大约一个月前更新软件包后,我遇到了这个问题。今天深入研究它,原因(对我来说)是 2023-06-29 的 {odbc} v. 1.3.5 更新。
尝试恢复到 1.3.4,直到在下一次 {odbc} 更新中解决此问题(希望如此)。remotes::install_version("odbc", "1.3.4")
评论