/** * 执行存储过程(目前只支持返回一个游标) never null * * @param sql * 执行的语句 * @param index * 当前游标的下标 * @param obj * 参数(用来替换sql语句中的?) * @param rop * 注册oracle的输出参数(注意,这里假如下标为1的是输入参数,为2的输出参数 * 则游标要以输出参数的下标进行获取,假如下标3到6是输入参数,7输出参数,则获取要根据第7个获取内容,以此类推....) * ResultSet rs = * OracleCallableStatement.getCursor(这里的下标必须和注册时候的下标保持一致); * @return */ public List<Map<String, Object>> searchToMapListForProduce(String sql, int index, Object obj[], int[] rop) { List<Map<String, Object>> l = new ArrayList<Map<String, Object>>(); Connection userConn = ins.getConn(); try { OracleCallableStatement ocs = (OracleCallableStatement) userConn.prepareCall(sql); // CallableStatement cs = con.prepareCall(sql); ocs.registerOutParameter(index, rop[0]);// 注册输出参数,同理可以用循环进行注册 for (int i = 0; i < obj.length; i++) { ocs.setObject(i + 1, obj[i]); }// 设置参数 ocs.execute(); ResultSet rs = ocs.getCursor(index);// 这个方式是oracle特供的 if (rs != null) { int cl = rs.getMetaData().getColumnCount(); while (rs.next()) { Map<String, Object> each = new HashMap<String, Object>(); for (int i = 0; i < cl; i++) { String key = rs.getMetaData().getColumnName(i + 1); Object val = rs.getObject(key); each.put(key, val); } l.add(each); } } else { System.out.println("current cursor for null!!!!!"); } } catch (Exception e) { System.out.println("查询存储过程出错:"+e.getCause().getMessage()); } finally { DBConnectionManager.getInstance().freeConnection(ins.getCus(),userConn); } return l; } //说明:本来这代码并不难,主要是把时间浪费在注册参数和读取数据这一块上了。
时间: 2024-10-12 11:49:21