在我的Spring批处理应用程序中,我运行两个SQL语句上的插入和一个合并.第一个查询插入数据在一个表从固定长度的文件.没有问题,直到这一点.我的第二个查询是合并查询与一些条件.根据该标准要么插入记录或合并记录.奇怪的是,插入和更新都发生在一个查询.我使用的是compositeItemWriter
@Bean
public JdbcBatchItemWriter<LiborObj> insertW() throws Exception{
JdbcBatchItemWriter<LiborObj> batchItemWriter = new JdbcBatchItemWriter<>();
batchItemWriter.setDataSource(oracleDataSource);
batchItemWriter.setSql(sqlInsert);
batchItemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<LiborObj>());
return batchItemWriter;
}
@Bean
public JdbcBatchItemWriter<LiborObj> mergeQuery() throws Exception{
JdbcBatchItemWriter<LiborObj> batchItemWriter = new JdbcBatchItemWriter<>();
batchItemWriter.setDataSource(oracleDataSource);
batchItemWriter.setSql(sqlMerge);
batchItemWriter.setItemPreparedStatementSetter(new ItemPreparedStatementSetter<LiborObj>() {
@Override
public void setValues(LiborObj liborObj, PreparedStatement ps) throws SQLException {
ps.setLong(1,jobContainer.getFeedFile().getPkey());
}
});
return batchItemWriter;
}
@Bean
public CompositeItemWriter<LiborObj> compositeItemWriter() throws Exception {
CompositeItemWriter<LiborObj> compositeItemWriter = new CompositeItemWriter<>();
compositeItemWriter.setDelegates(Arrays.asList(insertW(), mergeQuery()));
return compositeItemWriter;
}
我的合并查询是
merge into mastertbl
using (SELECT * FROM (SELECT rwtbl.*, row_number() OVER( PARTITION BY rwtbl.rate_type, rwtbl.cusip , rwtbl.Submitter_Company ORDER BY rwtbl.pkey) AS row_num FROM rwtbl WHERE rwtbl.ffid = 2931240 order by rwtbl.pkey) WHERE row_num =1 ) rwtbl
on (( mastertbl.rate_type = rwtbl.rate_type ) AND ( mastertbl.cusip = rwtbl.cusip ) AND ( mastertbl.Submitter_Company = rwtbl.Submitter_Company ))
when not matched then
insert..(,activity_status,).... values... (,'I',)...
when matched then
update....activity_status='U'
当我第一次运行这个查询时,它应该在主表中插入记录,但它也会更新记录。在主表中,我可以看到activity_status 'U'。这意味着在某个地方也执行了update语句,但第一次当主表为空时,应该总是activity_status ='I'
1条答案
按热度按时间cuxqih211#
CompositeItemWriter
按照注册委托的相同顺序执行所有委托。您可以使用ClassifierCompositeItemWriter对要插入或更新的项目进行分类,并将它们路由到正确的项目编写器。
您还可以使用自定义项编写器,该编写器根据所需的条件调用插入或更新查询。