首页 > 代码库 > java读取ORACLE 存储过程 返回游标(cursor) 格式 读取到List中

java读取ORACLE 存储过程 返回游标(cursor) 格式 读取到List中

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


java读取ORACLE 存储过程 返回游标(cursor) 格式 读取到List中