/**
* 执行存储过程(目前只支持返回一个游标) 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;
}
//说明:本来这代码并不难,主要是把时间浪费在注册参数和读取数据这一块上了。
转载于:https://my.oschina.net/u/1587544/blog/371792