一、问题
我们调用数据,大都是可以直接获取表中的数据,或者用复杂点的sql语句组成的。但是,有时候,当这样达不到我们要的全部数据的时候,这时,我们就用到了存储过程【sp】,如果sp需要参数是数组的话,要怎么办呢?
二、解决之法
public CbsResult payForBills(final String sapId, final String office,final ArrayListcustCdes) { Connection con = DBUtil.getCbsConnection(); ArrayDescriptor arrDesc; ARRAY arr; CbsResult cbs=null; CallableStatement cs=null; try { cs=con.prepareCall("{call CBS_TEST.CBS_PKG_EMF_PCARD.CBS_PRC_PCARD_DEDUCT_ITF(?,?,?,?,?,?,?,?,?,?)}"); arrDesc = ArrayDescriptor.createDescriptor("CBS_TEST.CHAR_ARRAY", getNativeConnection(con)); arr = new ARRAY(arrDesc, getNativeConnection(con), custCdes.toArray()); cs.setString(1, sapId); cs.setString(2, office); cs.setArray(3, arr); cs.setString(4, "EMF"); cs.setString(5, "EB");// EB/CORIS cs.setString(6, "OB"); cs.setString(7, "O"); cs.setString(8, "DEDUCT"); cs.registerOutParameter(9, OracleTypes.VARCHAR); cs.registerOutParameter(10, OracleTypes.VARCHAR); cs.execute(); cbs=new CbsResult(cs.getString(9), cs.getString(10), null); } catch (SQLException e) { e.printStackTrace(); }finally{ DBUtil.close(con, cs, null); } return cbs==null?new CbsResult():cbs; }
注意:
1、数组参数,必须在oracle数据库的存储过程中定义一个集合类型:
create or replacetype CHAR_ARRAY as table of VARCHAR2(20);
2、红色字体是存储过程中,数组的定义的名字,一定要保持一致。
3、绿色字体,是数组参数具体的实现方法。