/** * 執行存儲過程(目前只支持返回一個遊標) 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; } //說明:原本這代碼並不難,主要是把時間浪費在註冊參數和讀取數據這一塊上了。