曾经有段时间,因为要获取oracle存储过程或者函数中的多个返回值,但不知得在java代码中如何实现,因没有时间研究,就将结果通过编写sql函数,并将结果值串通过分隔符在一起来取值,通过select 函数名 from dual这样的模式来执行函数,虽然也能实现所要的结果,但总觉得有些怪异,故空闲下来后就上网搜索下,果然有比较好用的方法,便修改下本身的调用代码,执行成功后顺便分享下。
一、执行存储过程,
存储过程名P_SYNCH_EMPLOYBUSI,
参数有pa1,in;pa2,out;
String stmt_sql = "{call "+P_SYNCH_EMPLOYBUSI+"(?,?)}";
String str_result ="";
final String pa1 = para1;
final String pa2 = "test";
Map resultMap= (Map)this.getJdbcTemplate().execute(stmt_sql, new CallableStatementCallback(){
public Object doInCallableStatement(CallableStatement cs)throws SQLException,DataAccessException{
cs.setString(1, pa1);
//cs.setString(2, pa2);
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
Map map = new HashMap();
map.put("result", cs.getString(2));
return map;
}
});
该调用方法中涉及到了回调方法 CallableStatementCallback与CallableStatement 接口实现,如果不求甚解的话可以照搬,不过作为一名程序员,还是要理解个透最好。
调用函数方法也是差不多,就是将函数名修改即可,以下是函数的调用方法,有返回值哦^^
String stmt_sql = "{? =call F_BUSIPOITCALCULATE(?)}";
String str_result ="";
final String pa1 = temploybusi.getId().toString();
final String pa2 = "test";
Map resultMap= (Map)this.getJdbcTemplate().execute(stmt_sql, new CallableStatementCallback(){
public Object doInCallableStatement(CallableStatement cs)throws SQLException,DataAccessException{
cs.registerOutParameter(1, Types.NUMERIC);
cs.setInt(2, Integer.parseInt(pa1));
cs.execute();
Map map = new HashMap();
map.put("result", cs.getString(1));//获取返回值
return map;
}
});