使用ibmdbR软件包在R对象中附加和更新DB2表行

时间:2019-06-18 09:31:47

标签: r db2

我有一个要写入DB2并使用ibmdbR软件包进行更新的data.table DT。

我使用as.ida.data.frame上传了第一批。

> DT<- data.table(A = c(111,222,333,444), MONTH= c('2018-01', '2018-02', '2018-03', '2018-04'), B= c(11,22,33,44))
> DT
     A   MONTH  B
1: 111 2018-01 11
2: 222 2018-02 22
3: 333 2018-03 33
4: 444 2018-04 44

> db2_test <- as.ida.data.frame(DT, table='myschema.TEST', clear.existing=FALSE, case.sensitive=FALSE,
                  rownames=NULL, dbname='DB_NAME', asAOT=FALSE)

这将在数据库的我的模式中创建一个名为TEST的DB2表。 然后我尝试通过执行以下操作以使用另一个data.table DT2更新基于MONTH列的TEST:

> DT2 <- data.table(A = c(999,888), MONTH = c('2018-01', '2019-02'), B = c(99,77))
> DT2
     A   MONTH  B
1: 999 2018-01 99
2: 888 2019-02 77

> idaUpdate(myconnection, updf = 'myschema.TEST', dfrm = DT2, idaIndex = 'MONTH')
Error in sqlUpdate(db2Conn, dfrm, updf, index = idaIndex, fast = ifelse(idaIsOracleMode(),  : 
  [RODBC] Failed exec in Update02000 100 [IBM][CLI Driver][DB2/NT64] SQL0100W  No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.  SQLSTATE=02000

当我收到此错误时,当我查看DB2数据库中TEST表中的数据时,第一个条目已更改,这是预期的。

A    MONTH  B
999 2018-01 99
222 2018-02 22
333 2018-03 33
444 2018-04 44

所以我认为错误来自DT2中的第二个条目。 TEST中没有MONTH ='2019-02'的行,因此它失败。 但是我认为用索引列进行更新的重点是替换与索引列匹配的行,并添加不匹配的行?

如何使用DT2正确更新TEST,以便如果存在月份,则更新行?但是,如果TEST中没有与DT2中的MONTH列匹配的行,则添加新闻报道吗?

基本上,如何将数据从R对象正确附加到DB2表? 我从未遇到过AWS问题。 DB2是一场噩梦。

0 个答案:

没有答案