将R Dataframe 写入Oracle SQL数据库时,出现R DBI dbWriteTable“Not compatible with requested type”错误

rdlzhqv9  于 2023-09-27  发布在  Oracle
关注(0)|答案(1)|浏览(144)

我想使用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中创建的,但从不填充数据。
在此先谢谢您!

tgabmvqs

tgabmvqs1#

我在大约一个月前更新软件包后遇到了这个问题。今天,我就来看看这一点,这一点,是我的责任。1.3.5从2023-06-29更新。
尝试通过remotes::install_version("odbc", "1.3.4")恢复到1.3.4,直到这个问题在下一个{odbc}更新中得到解决(希望如此)。

相关问题