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;
	}
	
	
	//說明:原本這代碼並不難,主要是把時間浪費在註冊參數和讀取數據這一塊上了。
相關文章
相關標籤/搜索