我在 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 = F
,overwrite = T
)。
dbWriteTable(con_dwh, 't1', table_in_R,
append =FALSE, row.names=F, overwrite = TRUE)
资料被附加,但标识列id_record
被洗掉。
如何在不洗掉标识列的情况下将资料附加到 Oracle db?
uj5u.com热心网友回复:
我永远不会(基于这个dbWriteTable
答案)推荐这种直接维护目标表的一步方法。
相反,我建议采用两步方法,其中该R
部分填充一个临时表(使用overwrite = T
ieDROP
和CREATE
)
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")
请注意,无论如何都有一种解决方法:
将标识列定义为
id_record NUMERIC GENERATED BY DEFAULT ON NULL AS IDENTITY
标识列的这种配置 提供了正确的序列值而不是NULL
值 - 但是您将在上述插入数字列的链接问题上失败。NULL
- 所以第二个技巧是在 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 评论