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;
	}

	//说明:本来这代码并不难,主要是把时间浪费在注册参数和读取数据这一块上了。
时间: 2024-10-12 11:49:21

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

oracle 存储过程返回结果集

好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过程中先根据过滤条件从海量数据表中选出符合条件的记录并存放到临时中, 可以通过一个视图将临时表与其他相关表连接起来, 从而避免海量数据造成的连接效率问题. 本文只讨论使用存储过程返回结果集. 具体实现如下: -- 启用服务器输出---------------------set serveroutput

Oracle调用存储过程返回游标结果

/** 调用Oracle存储过程 */ public ResultSet queryForAllJSD_NEWEST(final String hpCode, final String id) { System.out.println("hpCode:"+hpCode+",id:"+id); ResultSet rs = (ResultSet)this.jdbctemplate.execute("{call pro_querybcb_newest(? ,

用java调用oracle存储过程总结(转)

//1.call+包名+存储过程名(传入.传出值用?) String str="{call SMSBUSINESS.deleteZhZMember(?,?,?)}"; //2.建立连接 Connection conn=null; conn=DriverManager.getConnection(); //3.使用java.sql.*类 CallableStatement cs=conn.prepareCall(str); //4.传入in值 cs.setInt(1,id); cs.se

Java调用Oracle存储过程

一:无返回值的存储过程 存储过程为: CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGIN INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2); END TESTA; 然后呢,在java里调用时就用下面的代码: import java.sql.*; import java.sql.ResultSet; public class T

springmvc+mybatis 调用oacle 存储过程返回游标!

oracle存储过程如下: HB_SAVE_MSG.P_QUERY_QUESTION_OF_QTA PROCEDURE P_QUERY_QUESTION_OF_QTA ( v_PaperID IN NUMBER, v_myCursor out MYCURSOR, v_optCursor out MYCURSOR ) IS BEGIN OPEN v_myCursor FOR SELECT A.QUESTION_ID,A.CONTENT,A.QTYPE_ID FROM T_QUESTION A IN

ibatis调存储过程返回游标

http://blog.sina.com.cn/s/blog_6f3ca78f01010pmj.html iBatic调用与JAVA调用很类似,只是JAVA把参数的注册放到了类里面,而iBatis把参数的注册放到了XML配置文件里,下面两个例子,第一个是返回普通数据,第二个是返回游标. 1:返回普通数据 Map map = new HashMap(); map.put("username", "JACK"); sqlMapClient.queryForObject(

mybatis 调用存储过程 返回游标 实例

存储过程示例: create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_cursor out sys_refcursor) is ……………… ---返回统计结果 open v_Cursor for select s.plan_code, s.plan_dept, s.plan_amount, s.exec_amount, p.cname as plan_name, d.cnam

oracle存储过程返回结果集

http://www.2cto.com/database/201204/127180.html oracle实现存储过程返回查询结果集合的方法 --实现存储过程返回查询结果集合的方法 ,以下代码来自网络整理 http://topic.csdn.net/u/20090721/12/ba403739-3212-4016-83ec-2a7062f21081.html Java代码 --第一种方法 create or replace Package SYSBasic as  www.2cto.com t

C#中使用Oracle存储过程返回结果集

问题: 在MSSQLServer中定义的存储过程可以直接返回一个数据集,如: create procedure sp_getAllEmployees as SELECT * FROM [NORTHWND].[dbo].[Employees] 在Oracle数据库中这样定义是错误的,怎么解决? 办法: Oracle中可以使用游标(Cursor)对数据集进行操作,但在存储过程输出参数中直接使用Cursor错误,此时的Cursor应该是一个定义游标的关键字并非类型,所以先要定义一个包,在包中声明全局的