Java SpringMvc+hibernate架构中,调用Oracle中的sp,传递数组参数

一、问题

  我们调用数据,大都是可以直接获取表中的数据,或者用复杂点的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/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 replace
type  CHAR_ARRAY  as table of VARCHAR2(20);

  2、红色字体是存储过程中,数组的定义的名字,一定要保持一致。

  3、绿色字体,是数组参数具体的实现方法。

原文地址:https://www.cnblogs.com/renxiaoren/p/5511899.html