请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

欣东微医疗技术论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 27|回复: 0

Oracle存储过程传入List<object>参数

[复制链接]

632

主题

766

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
38374
QQ
发表于 2018-7-5 19:19:12 | 显示全部楼层 |阅读模式
Oracle存储过程传入List<object>参数


--第一步,创建数据库对象
CREATE OR REPLACE TYPE param_object is object(
  aab001          NVARCHAR2(10),
  aab004          NVARCHAR2(512),
  company_contact NVARCHAR2(512),
  zipcode         NVARCHAR2(512),
  company_tel     NVARCHAR2(512),
  companyid       NVARCHAR2(512),
  medicare_date   DATE,
  addr            NVARCHAR2(512),
  aab101          NVARCHAR2(512),
  cab001          NVARCHAR2(512),
  principal_name  NVARCHAR2(512),
  principal_tel   NVARCHAR2(512),
  aab019          NVARCHAR2(512),
  ckb054          NVARCHAR2(512),
  aab020          NVARCHAR2(512),
  aae119          NVARCHAR2(512),
  financing_id    NVARCHAR2(512),
  degree_id       NVARCHAR2(512),
  comments        NVARCHAR2(512),
  mmonth          NVARCHAR2(512),
  cen_chk         NVARCHAR2(512),
  super_unit_id   NVARCHAR2(512),
  reason          NVARCHAR2(512),
  pension_payment NVARCHAR2(512),
  payment         NVARCHAR2(512),
  fund_co_pcode   NVARCHAR2(512),
  grant_dept      NVARCHAR2(512),
  shebao_aab001   NVARCHAR2(512),
  full_name       NVARCHAR2(512),
  collect_bank    NVARCHAR2(512),
  collect_account NVARCHAR2(512),
  faren           NVARCHAR2(512),
  tax_number      NVARCHAR2(512),
  hangyeleibie    NVARCHAR2(512),
  medicareid      NVARCHAR2(512),
  injure_tax      NVARCHAR2(512),
  quancheng       NVARCHAR2(512),
  injure_bank     NVARCHAR2(512),
  injure_account  NVARCHAR2(512),
  fengxianjin     NVARCHAR2(512)
);


--第二步,创建数据库list并且与数据库对象挂关系
create type param_array as table of param_object;


--第三步,创建存储过程将list<object>
  procedure get_kb80(tout out varchar2,kb80_list in param_array) is
    taab001 kb80_webservice.aab001%type;
    v_kb80 kb80_webservice%rowtype;
  begin
    execute immediate 'truncate table kb80_webservice';
    commit;
    for i in 1 .. kb80_list.count loop
      taab001 := kb80_list(i).aab001;
      v_kb80.aab001 := taab001;
      v_kb80.aab004 := kb80_list(i).aab004;
      v_kb80.company_contact := kb80_list(i).company_contact;
      v_kb80.zipcode := kb80_list(i).zipcode;
      v_kb80.company_tel := kb80_list(i).company_tel;
      v_kb80.companyid := kb80_list(i).companyid;
      v_kb80.medicare_date := kb80_list(i).medicare_date;
      v_kb80.addr := kb80_list(i).addr;
      v_kb80.aab101 := kb80_list(i).aab101;
      v_kb80.cab001 := kb80_list(i).cab001;
      v_kb80.principal_name := kb80_list(i).principal_name;
      v_kb80.principal_tel := kb80_list(i).principal_tel;
      v_kb80.aab019 := kb80_list(i).aab019;
      v_kb80.ckb054 := kb80_list(i).ckb054;
      v_kb80.aab020 := kb80_list(i).aab020;
      v_kb80.aae119 := kb80_list(i).aae119;
      v_kb80.financing_id := kb80_list(i).financing_id;
      v_kb80.degree_id := kb80_list(i).degree_id;
      v_kb80.comments := kb80_list(i).comments;
      v_kb80.mmonth := kb80_list(i).mmonth;
      v_kb80.cen_chk := kb80_list(i).cen_chk;
      v_kb80.super_unit_id := kb80_list(i).super_unit_id;
      v_kb80.reason := kb80_list(i).reason;
      v_kb80.pension_payment := kb80_list(i).pension_payment;
      v_kb80.payment := kb80_list(i).payment;
      v_kb80.fund_co_pcode := kb80_list(i).fund_co_pcode;
      v_kb80.grant_dept := kb80_list(i).grant_dept;
      v_kb80.shebao_aab001 := kb80_list(i).shebao_aab001;
      v_kb80.full_name := kb80_list(i).full_name;
      v_kb80.collect_bank := kb80_list(i).collect_bank;
      v_kb80.collect_account := kb80_list(i).collect_account;
      v_kb80.faren := kb80_list(i).faren;
      v_kb80.tax_number := kb80_list(i).tax_number;
      v_kb80.hangyeleibie := kb80_list(i).hangyeleibie;
      v_kb80.medicareid := kb80_list(i).medicareid;
      v_kb80.injure_tax := kb80_list(i).injure_tax;
      v_kb80.quancheng := kb80_list(i).quancheng;
      v_kb80.injure_bank := kb80_list(i).injure_bank;
      v_kb80.injure_account := kb80_list(i).injure_account;
      v_kb80.fengxianjin := kb80_list(i).fengxianjin;
      insert into kb80_webservice values v_kb80;
    end loop;
    commit;
    tout :='0|写入临时表成功';
    exception
      when others then
        tout := '-1|写入临时表失败|'||sqlerrm;
        rollback;
  end;

--第三步,java调用程序
    @Override
    public String upd_kc80webservice(final ArrayList<Kb80Webservice> kb80service_list,final int tnum) {
        @SuppressWarnings({ "unchecked", "rawtypes" })
        Object obj = getHibernateTemplate().execute(new HibernateCallback() {
        @SuppressWarnings("deprecation")
            public Object doInHibernate(Session session)throws HibernateException, SQLException {
                Connection con = session.connection();
                OracleConnection oracleconn= con.unwrap(OracleConnection.class);

               
                ARRAY aArray;
                try {
                    aArray = getArray(oracleconn, "PARAM_OBJECT","PARAM_ARRAY", kb80service_list,tnum);
                    String procedure = "{call eastwill_webservice.get_kb80(?,?)}";
                    // 1为输出结果    // 2为入参            
                    OracleCallableStatement cstmt = (OracleCallableStatement) oracleconn.prepareCall(procedure);
                    String t1 = "";
                    cstmt.registerOutParameter(1, Types.VARCHAR);
                    cstmt.setARRAY(2, aArray);
                    
                    cstmt.executeUpdate();
                    t1 = cstmt.getString(1);
                    return t1;
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    return "-1|"+e;
                }               
            }
        });
        return (String) obj;
    }
   
    /**
     * 将java数组转换成数据库数组
     * @param con            原生jdbc链接,链接池的链接不行
     * @param OracleObj        数据库自定义对象
     * @param Oraclelist    数据库自定义数组
     * @param objlist        需要的参数
     * @param paramNum        自定义对象的个数
     * @return   
     * @throws Exception
     */
    private ARRAY getArray(Connection con, String OracleObj,String Oraclelist, ArrayList<Kb80Webservice> objlist,int paramNum) throws Exception {
        ARRAY list = null;
        if (objlist != null && objlist.size() > 0) {
            StructDescriptor structdesc = StructDescriptor.createDescriptor(OracleObj,con);
            STRUCT[] structs = new STRUCT[objlist.size()];
            for (int i = 0; i < objlist.size(); i++) {
                Kb80Webservice tkb80 = objlist.get(i);
                Object[] oneRow = new Object[40];
                oneRow[0] = tkb80.getAab001(); // 将Student对象的每个属性按顺序设置到oneRow数组中
                oneRow[1] = tkb80.getAab004();
                oneRow[2] = tkb80.getCompanyContact();
                oneRow[3] = tkb80.getZipcode();
                oneRow[4] = tkb80.getCompanyTel();
                oneRow[5] = tkb80.getCompanyid();
                oneRow[6] = tkb80.getMedicareDate();
                oneRow[7] = tkb80.getAddr();
                oneRow[8] = tkb80.getAab101();
                oneRow[9] = tkb80.getCab001();
                oneRow[10] = tkb80.getPrincipalName();
                oneRow[11] = tkb80.getPrincipalTel();
                oneRow[12] = tkb80.getAab019();
                oneRow[13] = tkb80.getCkb054();
                oneRow[14] = tkb80.getAab020();
                oneRow[15] = tkb80.getAae119();
                oneRow[16] = tkb80.getFinancingId();
                oneRow[17] = tkb80.getDegreeId();
                oneRow[18] = tkb80.getComments();
                oneRow[19] = tkb80.getMmonth();
                oneRow[20] = tkb80.getCenChk();     
                oneRow[21] = tkb80.getSuperUnitId();
                oneRow[22] = tkb80.getReason();
                oneRow[23] = tkb80.getPensionPayment();
                oneRow[24] = tkb80.getPayment();
                oneRow[25] = tkb80.getFundCoPcode();
                oneRow[26] = tkb80.getGrantDept();
                oneRow[27] = tkb80.getShebaoAab001();
                oneRow[28] = tkb80.getFullName();
                oneRow[29] = tkb80.getCollectBank();
                oneRow[30] = tkb80.getCollectAccount();
                oneRow[31] = tkb80.getFaren();
                oneRow[32] = tkb80.getTaxNumber();
                oneRow[33] = tkb80.getHangyeleibie();
                oneRow[34] = tkb80.getMedicareid();
                oneRow[35] = tkb80.getInjureTax();
                oneRow[36] = tkb80.getQuancheng();
                oneRow[37] = tkb80.getInjureBank();
                oneRow[38] = tkb80.getInjureAccount();
                oneRow[39] = tkb80.getFengxianjin();
                // 将list中元素的数据传入result数组 result[1] = new Integer(..); //
                structs[i] = new STRUCT(structdesc, con, oneRow);
                //System.out.println("i="+i+" "+oneRow[1]);
            }
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,con);
            list = new ARRAY(desc, con, structs);
        }
        return list;
    }

注1:自定义对象里面的字符必须要使用nvarchar2,不然java代码将字符串的格式封装不进去。链接要使用jdbc原生链接(Connection)才能对自定义对象和数组的转换,使用链接池转换不过来。
注2:定义type的nvarchar2的长度不能小,否则即使改了表结构还是不变,当时困扰了一会让儿。
注3:我们通过session.connection()得到的数据库连接是封装过的,需要OracleConnection oracleconn= con.unwrap(OracleConnection.class);来解开封装


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|eastwill.org ( 辽ICP备17018600号

GMT+8, 2018-7-19 00:10 , Processed in 0.090257 second(s), 26 queries .

Powered by Eastwill! X3.2

© 2001-2013 Eastwill Inc.

快速回复 返回顶部 返回列表