diff --git a/ureport2-core/src/main/java/com/bstek/ureport/utils/ProcedureUtils.java b/ureport2-core/src/main/java/com/bstek/ureport/utils/ProcedureUtils.java index 44467fe..3d337d7 100644 --- a/ureport2-core/src/main/java/com/bstek/ureport/utils/ProcedureUtils.java +++ b/ureport2-core/src/main/java/com/bstek/ureport/utils/ProcedureUtils.java @@ -42,10 +42,16 @@ public class ProcedureUtils { } public static List procedureColumnsQuery(String sql,Map pmap,Connection conn){ - CallableStatement cs=buildProcedureCallableStatement(sql, pmap, conn); + StatementWrapper wrapper=buildProcedureCallableStatement(sql, pmap, conn); + CallableStatement cs=wrapper.getCallableStatement(); + int oracleCursorIndex=wrapper.getOracleCursorIndex(); ResultSet rs=null; try { - rs=cs.executeQuery(); + if(oracleCursorIndex==-1){ + rs=cs.executeQuery(); + }else{ + rs=(ResultSet)cs.getObject(oracleCursorIndex); + } ResultSetMetaData metadata=rs.getMetaData(); int columnCount=metadata.getColumnCount(); List fields=new ArrayList(); @@ -65,10 +71,16 @@ public class ProcedureUtils { public static List> procedureQuery(String sql,Map pmap,Connection conn){ - CallableStatement cs=buildProcedureCallableStatement(sql, pmap, conn); + StatementWrapper wrapper=buildProcedureCallableStatement(sql, pmap, conn); + CallableStatement cs=wrapper.getCallableStatement(); + int oracleCursorIndex=wrapper.getOracleCursorIndex(); ResultSet rs=null; try { - rs=cs.executeQuery(); + if(oracleCursorIndex==-1){ + rs=cs.executeQuery(); + }else{ + rs=(ResultSet)cs.getObject(oracleCursorIndex); + } ResultSetMetaData metadata=rs.getMetaData(); int columnCount=metadata.getColumnCount(); List> result=new ArrayList>(); @@ -90,7 +102,7 @@ public class ProcedureUtils { } } - private static CallableStatement buildProcedureCallableStatement(String sql,Map pmap,Connection conn){ + private static StatementWrapper buildProcedureCallableStatement(String sql,Map pmap,Connection conn){ try { Map paramMap=new LinkedHashMap(); int leftParnPos=sql.indexOf("("); @@ -99,10 +111,16 @@ public class ProcedureUtils { if(leftParnPos>-1 && rightParnPos>-1){ paramStr=sql.substring(leftParnPos+1,rightParnPos); } + int oracleCursorIndex=-1,paramIndex=0; String[] str=paramStr.split(","); for(String param:str){ + paramIndex++; param=param.trim(); - if(!param.startsWith(":")){ + if(param.toLowerCase().equals("oracle")){ + sql=sql.replaceFirst(param, "?"); + oracleCursorIndex=paramIndex; + continue; + }else if(!param.startsWith(":")){ continue; } sql=sql.replaceFirst(param, "?"); @@ -117,9 +135,26 @@ public class ProcedureUtils { cs.setObject(index, paramMap.get(name)); index++; } - return cs; + if(oracleCursorIndex>-1){ + cs.registerOutParameter(oracleCursorIndex, -10); + } + return new StatementWrapper(cs,oracleCursorIndex); } catch (SQLException e) { throw new ReportException(e); } } } +class StatementWrapper{ + private CallableStatement callableStatement; + private int oracleCursorIndex; + public StatementWrapper(CallableStatement callableStatement,int oracleCursorIndex) { + this.callableStatement=callableStatement; + this.oracleCursorIndex=oracleCursorIndex; + } + public CallableStatement getCallableStatement() { + return callableStatement; + } + public int getOracleCursorIndex() { + return oracleCursorIndex; + } +}