我在 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 = TieDROP和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)
測驗作業正常,但如前所述,我建議采用兩步法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414323.html
標籤:
下一篇:將Sum(x)Keep(Dense_RankLastOrderbyy)從oracle轉換為具有限制因子的BigQuery
