将 R 数据帧写入 Oracle SQL 数据库时出现 R DBI dbWriteTable“与请求的类型不兼容”错误

R DBI dbWriteTable "Not compatible with requested type" error when writing R data frame to Oracle SQL database

提问人:danadbm 提问时间:8/14/2023 最后编辑:Laureldanadbm 更新时间:9/12/2023 访问量:218

问:

我想使用该包将数据帧从 R 写入 Oracle SQL 数据库。我能够使用软件包成功执行此操作,但我希望能够使用软件包更正此错误。DBIRODBCDBI

我得到的错误是(见下文)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 中创建的,但从未填充过数据。

先谢谢你!

rodbc r-dbi roracle

评论

0赞 R_User123456789 8/29/2023
我也遇到了几乎完全相同的问题,并且还确认它正在通过 RODBC 工作......我在一个只有一列的测试表上做了我的,甚至不断将其定义更改为不同的数据类型,所有这些都有相同的错误......

答:

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")