一、问题
我们调用数据,大都是可以直接获取表中的数据,或者用复杂点的sql语句组成的。但是,有时候,当这样达不到我们要的全部数据的时候,这时,我们就用到了存储过程【sp】,如果sp需要参数是数组的话,要怎么办呢?
二、解决之法
public CbsResult payForBills(final String sapId, final String office,final ArrayList<String> custCdes) {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/CORIScs.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 replace type CHAR_ARRAY as table of VARCHAR2(20);
2、红色字体是存储过程中,数组的定义的名字,一定要保持一致。
3、绿色字体,是数组参数具体的实现方法。