拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何使用标识列将资料从R附加到Oracledb表

如何使用标识列将资料从R附加到Oracledb表

白鹭 - 2022-02-02 2115 0 0

我在 Oracle 中创建了一个表,例如

Create table t1 
(id_record  NUMERIC GENERATED AS IDENTITY START WITH 500000 NOT NULL,
col1 numeric(2,0),
col2 varchar(10),
primary key(id_record))

身份列在哪里, id_record其值是在将资料附加到表时自动生成的。

我在 R 中创建了一个带有 2 列 ( table_in_R <- data.frame(col1, col2)) 的 data.frame。为简单起见,让我们跳过资料框的值。

当我使用以下代码将资料从 R 附加到 Oracle db

dbWriteTable(con, 't1', table_in_R, 
         append =T, row.names=F, overwrite = F)

con连接物件在哪里出现错误并且ORA-00947没有附加资料。

当我稍微修改我的代码(append = Foverwrite = T)。

dbWriteTable(con_dwh, 't1', table_in_R, 
         append =FALSE, row.names=F, overwrite = TRUE)

资料被附加,但标识列id_record被洗掉。

如何在不洗掉标识列的情况下将资料附加到 Oracle db?

uj5u.com热心网友回复:

我永远不会(基于这个dbWriteTable答案)推荐这种直接维护目标表的一步方法。

相反,我建议采用两步方法,其中该R部分填充一个临时表(使用overwrite = TieDROPCREATE

df <- data.frame(col1 = c(as.integer(1),as.integer(0)), col2 = c('x',NA))
dbWriteTable(jdbcConnection,"TEMP", df,   rownames=FALSE, overwrite = TRUE, append = FALSE)

第二步中,您只需使用简单地新行添加到目标表中

insert into t1(col1,col2) select col1,col2 from temp;

您可以通过数据库连接直接呼叫它,也可以从以下位置呼叫它R

res <-   dbSendUpdate(jdbcConnection,"insert into t1(col1,col2) select col1,col2 from temp")

请注意,无论如何都有一种解决方法

  1. 将标识列定义

    id_record NUMERIC GENERATED BY DEFAULT ON NULL AS IDENTITY

标识列的这种配置 提供了正确的序列值而不是NULL值 - 但是您将在上述插入数字列的链接问题上失败NULL

  1. 所以第二个技巧是在 data.frame中使用一个字符 NA

将标识列添加到您的 data.frame 并用 all 填充它as.character(NA)

df <- data.frame(id_record =c(as.character(NA),as.character(NA) ), col1 = c(as.integer(1),as.integer(0)), col2 = c('x',NA))
dbWriteTable(jdbcConnection,"T1", df,   rownames=FALSE, overwrite = F, append = T) 

测验作业正常,但如前所述,我建议采用两步法。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *