【问题标题】:How to upload data into Oracle db from R?如何从 R 将数据上传到 Oracle 数据库?
【发布时间】:2022-01-17 19:54:22
【问题描述】:

我需要将数据从 R 上传到 Oracle 数据库。 我遵循这个问题的建议 how to export data frame (R) into Oracle table.

我使用代码:

dbWriteTable(con_dwh, "table_db", table_in_R, 
         append =T, row.names=F, overwrite = F)

其中con_dwh 是与 Oracle 数据库的 JDBC 连接。

但是我收到了错误消息:

Error in .local(conn, statement, ...) : 
execute JDBC update query failed in dbSendUpdate (NaN)

我对发生的错误有点困惑。

有人可以帮我吗?

【问题讨论】:

  • 可能是其中一行具有未正确解释的值。尝试插入一行。如果可行,添加 10 或 50 行(取决于你有多少)。继续直到再次失败,然后尝试确定新批次的哪一行是罪魁祸首。如果找到该行并不能清楚地表明哪个值有问题,请返回并edit 您的问题至少包括一个好行和一个坏行。祝你好运!
  • @r2evans 我尝试插入 1 行。结果 - 错误 ORA-00947。我不知道为什么会发生此错误。这可能是由于插入数据时会自动生成 myst 的标识列值吗?
  • 我不使用Oracle,所以我真的只能帮助建议确定问题的过程。也许除了我建议的“单个行”之外,您还可以尝试单列或一小组列,直到您可以插入而不会出错,然后继续努力解决哪个列正在执行此操作。 (顺便说一句:ORA-00947 建议空值,""NA,可能是一个问题。我也不使用 JDBC,更喜欢非 java odbc,所以也许这也在起作用在这里。
  • ORA-00947 simple 表示表格比数据框有更多的列。简单使用overwrite = T, append = F就消失了……
  • @MarmiteBomber 确实问题消失了。但是我遇到了另一个问题,即 R 无法插入带有na 的行。怎么处理?

标签: r oracle jdbc


【解决方案1】:

由于某些原因,dbWriteTable num 列中的 NA 值无法作为 NULL 插入,这对于 chr 列有效。

因此解决方法是将num 列中的NA 替换为有效数字-i#m 使用`0``。

如果您需要在表中以null 结尾,请在数据库中使用一些特殊 数字和UPDATE 为空。

> df <- data.frame(col1 = c('x',NA,'y'), col2 = c(1,NA,NA))
> 
> df
  col1 col2
1    x    1
2 <NA>   NA
3    y   NA
> str(df)
'data.frame':   3 obs. of  2 variables:
 $ col1: chr  "x" NA "y"
 $ col2: num  1 NA NA
> 
> dbWriteTable(jdbcConnection,"TEST", df,   rownames=FALSE, overwrite = TRUE, append = FALSE)  
Fehler in .local(conn, statement, ...) : 
  execute JDBC update query failed in dbSendUpdate (NaN)
> 
> df[is.na(df$col2),"col2"] <- 0
> df
  col1 col2
1    x    1
2 <NA>    0
3    y    0
> 
> dbWriteTable(jdbcConnection,"TEST", df,   rownames=FALSE, overwrite = TRUE, append = FALSE) 
> 

在数据库中

select * from test

COL1           COL2
-------- ----------
x                 1
                  0
y                 0

对于 integer 数据类型 int 插入 NA works 但插入的值是 -2147483648 也不好。

df <- data.frame(  id  = c(as.integer(NA),as.integer(NA)) )
dbWriteTable(jdbcConnection,"TEST", df,   rownames=FALSE, overwrite = TRUE, append = FALSE) 

## OK but

select * from test

ID
-2147483648
-2147483648

这可能与 NA 作为整数的内部存储有关。

使用R version 4.0.4RJDBC_0.2-8 生成的注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多