本文中罗列基于JdbcTemplate调用存储过程的情况,在实际应用中可以依据实际情况选择合理的方式使用。
1. 有参,无返回值,有结果集
// 存储过程依据传入的参数进行查询,但是存储过程中没有设置返回值,可以使用本处理方式
public List<DTO> queryInHospitalPatFee(String date) {
List<DTO> list = jdbcTemplate.execute("exec ODR_CUR ? ", ( CallableStatementCallback<List<DTO>>) cs->{
List<DTO> retList = new ArrayList<>();
cs.setObject(1,date); // 设置入参
ResultSet rs = cs.executeQuery();
while(rs!=null&&rs.next()){
DTO tmp = new DTO();
...
tmp.setTotalFee(rs.getDouble("费用"));
retList.add(tmp);
}
return retList;
});
return list;
}
2. 有返回值,无结果集
// 存储过程返回的值在存储过程中有定义,可以直接使用本处理方式
public void test() {
String param = jdbcTemplate.execute(
con -> {
String sql = "{call query_cur2 (?,?)}";// 调用存储过程
CallableStatement cs = con.prepareCall(sql);
cs.setString(1, "p1");// 设置输入参数的值
cs.registerOutParameter(2, OracleType.VARCHAR2);// 注册输出参数的类型
return cs;
}, (CallableStatementCallback) cs -> {
cs.execute();
return cs.getString(2);// 获取输出参数的值
});
}