我有一个要写入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是一场噩梦。