/*** 执行存储过程
*
*@paramprocedure过程名
*@paramsqlType
* 返回值类型,无返回值传null
*@paramprocedureCallBack
* 回调对象
*@return*/privateProcedureResult execProc(String procedure, Integer sqlType,
ProcedureCallBack procedureCallBack) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
ProcedureResult procResult=newProcedureResult();try{
procedureCallBack.jt=this;
conn=getConnection();//取连接procedureCallBack.registerParameter();//计算参数的个数intparameterSize=procedureCallBack.parametersCount;//取参数的个数procedureCallBack.parametersCount=0;if(parameterSize>0)
procedure=procedure+getProcParameters(parameterSize,"?");//根据参数的个数拼装sqlString sql="{"+(sqlType!=null?"?=":"")+"call"+procedure+"}";
logger.debug("exec"+sql);
CallableStatement cstm=conn.prepareCall(sql);//预编译过程procedureCallBack.cstm=cstm;
procedureCallBack.startParametersIdx=sqlType!=null?1:0;//对外界忽略带返回值过程的参数下标if(sqlType!=null)
procedureCallBack.registerOutParameter(0, sqlType.intValue());//注册带返回值过程的返回类型oracle不支持mssql支持procedureCallBack.registerParameter();//注册参数booleanresults=cstm.execute();//执行过程intrsIndex=1;//结果集个数计数器for(; results; rsIndex++) {
rs=cstm.getResultSet();//取当前结果集List list=newArrayList();//为当前结果集创建一个容器while(rs.next())
list.add(procedureCallBack.mapRow(rs, rsIndex));
procResult.addRs(list);
results=cstm.getMoreResults();//取下一个结果集}
Map map=procedureCallBack.getOutParameters();//取声明的out参数,Iterator iterator=map.keySet().iterator();//遍历声明的out参数while(iterator.hasNext()) {
String key=iterator.next().toString();//out参数类型intidx=Integer.valueOf(key).intValue();if(newInteger(-10).equals(map.get(key))) {//oracle结果集列表是通过游标的形式利用out参数输出的oracle.jdbc.OracleTypes.CURSOR的值是-10closeResultSet(rs);//关闭上次使用的结果集rs=(ResultSet) cstm.getObject(Integer.valueOf(key)
.intValue());//从out参数中取结果集List list=newArrayList();//为当前结果集创建一个容器while(rs.next())
list.add(procedureCallBack.mapRow(rs, rsIndex));
rsIndex++;//结果集计数器累加procResult.addRs(list);
}elseif(idx==1&&sqlType!=null)//如果过程有返回值,从第一个out参数中取得这个返回值procResult.setValue(JdbcUtils.getCallableStatementValue(
cstm, idx));elseprocResult.getOutput().add(
JdbcUtils.getCallableStatementValue(cstm, idx));//取的普通的out参数输出到out输出容器}if(sqlType==null&&procResult.getOutput().size()>0)//如果过程没用返回值,例如oracle过程根本不支持返回值,将第一个非游标的out参数返回值当作过程返回值procResult.setValue(procResult.getOutput().get(0));
}catch(SQLException e) {thrownewDataAccessException(e);
}finally{
closeResultSet(rs);
closeStatement(stmt);
closeConnection(conn);
}returnprocResult;
}publicclassProcedureResult {privateList rs=newArrayList();//过程返回的n个结果集列表privateList output=newArrayList();//过程的out参数输出privateObject value;//过程本身的返回值略
}