java.sql.SQLException:jdbcTemplate中带有In子句的更新查询的无效列类型

时间:2019-02-11 11:56:41

标签: java spring oracle jdbctemplate

我正尝试使用jdbcTemplate如下更新Oracle表行

String sql = "update EVENTS set status = null where TEMP_ID IN (select TEMP_ID from EVENTS where STATUS = 'COMPLETE' and EXCHANGE_ID IN (?)   )";    
Map<String, Object> paramMap = new HashMap<String, Object>();
List<Long> longValues = new ArrayList<Long>();
longValues.add(1);
longValues.add(2);
paramMap.put("EXCHANGE_ID", longValues);
int rowsAffected = this.jdbcTemplate.update(sql,paramMap,Long.class);

其中EXCHANGE_ID是EVENTS表中数据类型为NUMBER(6,0)的列。

当我尝试运行上述程序时,它会引发如下异常

  

PreparedStatementCallback; SQL的未分类SQLException [更新   活动设置状态= null,其中“ TEMP_ID IN”(从“活动”中选择TEMP_ID   其中STATUS ='COMPLETE'和EXCHANGE_ID =吗? )]; SQL状态[99999];   错误代码[17004];无效的列类型;嵌套异常为   java.sql.SQLException:无效的列类型

编辑: In子句中的参数数量不固定。因此参数的数量可以是2,3,具体取决于用户。

为简单起见,我在代码中添加了以下几行

longValues.add(1);
longValues.add(2);

实际上,我从表单接收参数。我刚刚在问题中添加了部分代码。

由于某些限制,我只能使用?在我的SQL查询中我的参数位置不是:EXCHANGE_ID

1 个答案:

答案 0 :(得分:1)

已更新:您需要在SQL语句中使用:EXCHANGE_ID

final String sql = "update EVENTS set status = null where TEMP_ID IN (select TEMP_ID from EVENTS where STATUS = 'COMPLETE' and EXCHANGE_ID = :EXCHANGE_ID)";

final MapSqlParameterSource params = new MapSqlParameterSource();
params.put("EXCHANGE_ID", Long.valueOf(1));

int rowsAffected = this.jdbcTemplate.update(sql, params);