在java开发过程中有时候为了处理数据的速度更快,会把要处理的数据组装成list,把list作为过程的一个参数,在过程中批量处理,下面就以一个例子做简单的阐述,以此谨记。

--药品目录智能审核

--说明:药品目录上传首先是保存在DB1建的临时表中ka19_temp,最终经过调用webservice接口调用DB2的过程PKG_DIRECTROYBUSINESS.WSBS_VALIDATE_DIRECTROY

--创建type //这里的type可以等同于创建一个table

CREATE OR REPLACE TYPE "KA19MX" AS OBJECT(
        AKB020 VARCHAR2(20),--定点医疗机构编号
        SKE534 VARCHAR2(100),--定点医疗机构药品编号
        SKE535 VARCHAR2(100),--定点机构药品名
        AKE001 VARCHAR2(100),--社保三大目录统一编码
        AKC225 NUMBER(10,4),--单价
        AAE011 VARCHAR2(20),--经办人
        AKA070 VARCHAR2(100),--剂型
        AKA077 VARCHAR2(100),--规格
        AKA083 VARCHAR2(100), --药厂名称
        AKA067 VARCHAR2(100) --药品剂量单位
)

CREATE OR REPLACE TYPE "KA19MXLIST" AS TABLE OF KA19MX  //这里相当于创建上面的一个记录,即表的记录

--上面type创建好之后在java层调用过程就可以对应使用--以下是配置webservice接口例子

/**
     * 验证要保存的药品目录信息
     * @param akb020 定点医疗机构编号
     * @param aae011 经办人姓名
     * @param jdbctemplate_2 网办数据源
     * @param jdbctemplate_1 核三业务库数据源
     * @return
     * @author xhw
     * @date 2018-01-03
     * 备注:由于医保中心并没有给明确的需求 现在只是按照最早的上传药品目录信息进行开发,后期需求确定后在修改程序
     */
    public String validateMuLu(String akb020,String aae011){
        Connection conn=null;
        CallableStatement cs=null;
        String result="";
        String msg="";
        try {
            //根据传递过来的定点医疗机构编号到网办ka19_temp中查询已经经过初步验证保存成功的数据
            String sql="select  * from ka19_temp where akb020='"+akb020+"' and iserror='001'";
            List<Ka19DTO> list=jdbctemplate_2.query(sql.toString(), new BeanPropertyRowMapper(Ka19DTO.class));
            if(list.size()<=0){
                return ReaderSoapXmlOut.BuildSoapXMlError("3000", "没有正确数据!");
            }
            List<Object[]> ka19mxlist = new ArrayList<Object[]>();
            //组装以数组形式的list
            for(int i=0;i<list.size();i++){
                Object[] objs = new Object[10];
                objs[0] = list.get(i).getAkb020();//定点医疗机构编号
                objs[1] = list.get(i).getSke534();//定点医疗机构药品编号
                objs[2] = list.get(i).getSke535();//药品商品名
                objs[3] = list.get(i).getAke001();//社保三大目录统一编码
                objs[4] = list.get(i).getAkc225();//单价
                objs[5] = list.get(i).getAae011();//经办人
                objs[6] = list.get(i).getAka070();//剂型
                objs[7] = list.get(i).getAka077();//规格
                objs[8] = list.get(i).getAka083();//药厂名称/生产厂家
                objs[9] = list.get(i).getAka067();//药品剂量单位
                ka19mxlist.add(objs);
            }
            //调用核三自动审核过程
            
            String sql2="call PKG_DIRECTROYBUSINESS.WSBS_VALIDATE_DIRECTROY(?,?)";
            conn=jdbctemplate_1.getDataSource().getConnection();
            cs=conn.prepareCall(sql2);
            //根据数据库中自定义的type把list组装成array
            ARRAY array = OraUtil.getArray(conn, "KA19MX", "KA19MXLIST", ka19mxlist);//KA19MX、KA19MXLIST即上面在oracle中创建的type
            //设置过程入参类型
            cs.setArray(1, array);
            //设置过程出参类型
            cs.registerOutParameter(2, Types.VARCHAR);
            //执行
            cs.execute();
            msg=cs.getString(2);
            if(!msg.equals("OK")){
                return ReaderSoapXmlOut.BuildSoapXMlError("3000", msg);
            }
            //保存成功后 删除临时表中所有该定点医疗机构的数据  --测试暂时不删除 正式上线的时候要全部删掉
            //String sql3="delete from ka19_temp where akb020='"+akb020+"'";
            //jdbctemplate_2.execute(sql3);
            return ReaderSoapXmlOut.BuildSoapSuccessXMl();
        } catch (Exception e) {
            e.printStackTrace();
            String errMsg=e.getMessage();
            errMsg=errMsg.replaceAll("\"", "");
            errMsg=errMsg.replaceAll(";", "");
            result=ReaderSoapXmlOut.BuildSoapXMlError("3000", errMsg);
        }finally{
            try {
                if (cs != null)
                    cs.close();
                if(null != conn)
                    conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                String errMsg = e.getMessage();
                errMsg = errMsg.replaceAll("\"", "");
                errMsg = errMsg.replaceAll(";", "");
                return ReaderSoapXmlOut.BuildSoapXMlError("3000", errMsg);
            }
    }
        return result;
    }

/**
     * 根据数据库中你的type将List组装成Array
     * @param con
     * @param OracleObj
     * @param Oraclelist
     * @param objlist
     * @return
     * @throws Exception
     */
    public static ARRAY getArray(Connection con, String OracleObj,String Oraclelist, List<Object[]> objlist) throws Exception {    
        ARRAY array=null;
          C3P0NativeJdbcExtractor cp30NativeJdbcExtractor = new C3P0NativeJdbcExtractor();  
          OracleConnection connection = (OracleConnection) cp30NativeJdbcExtractor.getNativeConnection(con);

if (objlist != null && objlist.size() > 0) {
            StructDescriptor structdesc = new StructDescriptor(OracleObj, connection);
            STRUCT[] structs = new STRUCT[objlist.size()];
            for (int i = 0; i < objlist.size(); i++) {
                Object[] result= (Object[]) objlist.get(i);
                structs[i] = new STRUCT(structdesc, connection, result);
            }
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,connection);
            array = new ARRAY(desc, connection, structs);
        }
        
        return array;
    }

--上面调用过程 list作为过程的一个参数 在过程中遍历的例子

CREATE OR REPLACE PACKAGE BODY PKG_DIRECTROYBUSINESS IS
    /************************************************************************************************
     ||过程名称:WSBS_VALIDATE_DIRECTROY
     ||功能描述:网办系统药品目录申报在保存的时候把经过初步验证的信息保存到核三ka19中来,
     并且调用自动审核过程,报审核结果同步更新ka19中
     ||参数:上传目录组成的集合 ka19mxlist
     ||作者:XuHW
     ||日期:2018-01-04 10:03:21
  **************************************************************************************************/
  PROCEDURE WSBS_VALIDATE_DIRECTROY(
      ka19mxlist IN KA19MXLIST,--申报目录list
      po_msg     OUT VARCHAR2  --错误信息 OK成功 其余全是失败
  )AS
   ROW_KA19 AHSICP3.KA19%ROWTYPE;--目录明细
   ROW_KA20 AHSICP3.KA20%ROWTYPE;--目录库信息
   PC0000   VARCHAR2(20);--序列
   LS_CODE  VARCHAR2(20);--信息编码
   LS_ERRMSG VARCHAR2(500);--自定义错误信息
   LE_ERROR  EXCEPTION;--异常

BEGIN
   --初始化
    LS_CODE:='1';
    LS_ERRMSG:='';
    po_msg:='OK';
     --处理提交的目录list
     for i IN 1..KA19MXLIST.count loop
       --根据社保统一编码查询到ka20的明细
       SELECT * INTO ROW_KA20 FROM AHSICP3.KA20 WHERE SKC033='001' AND  AKE001=KA19MXLIST(I).AKE001;

row_ka19.oae001:=ahsiyb.seq_ka19_oae001.nextval;--唯一标识
       row_ka19.akb020:=KA19MXLIST(i).akb020;--定点医疗机构编号
       row_ka19.ske534:=KA19MXLIST(i).ske534;--定点医疗机构药品编码
       row_ka19.ske535:=KA19MXLIST(i).ske535;--药品商品名
       row_ka19.aka067:=KA19MXLIST(i).aka067;--药品剂量单位
       row_ka19.aka073:='';--用法
       row_ka19.aka071:='';--每次用量
       row_ka19.aka072:='';--使用频次
       row_ka19.aka070:=KA19MXLIST(i).aka070;--剂型
       row_ka19.aka076:='';--单位
       row_ka19.aka077:=KA19MXLIST(i).aka077;--规格
       row_ka19.aka078:=NULL;--限定天数
       row_ka19.aka081:=ROW_KA20.aka020;--拼音助记码
       row_ka19.aka082:=ROW_KA20.aka021;--五笔助记码
       row_ka19.aka083:='';--药厂名称
       row_ka19.aka084:='';--自制药品标志
       row_ka19.aka064:='';--处方药标志
       row_ka19.ake001:=KA19MXLIST(i).ake001;--社保三大目录统一编码
       row_ka19.akc175:='000';--审批标志 未审核
       row_ka19.aae011:=KA19MXLIST(i).aae011;--经办人
       row_ka19.aae036:=sysdate;--经办日期
       row_ka19.aae013:='数据来源网办申报';--备注
       row_ka19.oae300:=NULL;
       row_ka19.OAE301:=NULL;
       row_ka19.AKA085:='';--国药准字
       row_ka19.aka063:=ROW_KA20.aka063;--收费类别
       row_ka19.akc225:=KA19MXLIST(i).akc225;--价格
       row_ka19.skd053:='';--批准文号
       
       --把目录明细添加到ka19中
       INSERT INTO AHSICP3.KA19 VALUES row_ka19;
       SELECT ahsiyb.seq_kbadls_pc0000.nextval INTO PC0000 FROM dual;
       --调用药品目录自动审核过程
       ahsiyb.SP_CATALOG_AUTOREVIEW(row_ka19.oae001,'20170901','99991231',PC0000,LS_CODE,LS_ERRMSG);
       IF LS_CODE=2 THEN
        RAISE LE_ERROR;
       END IF;
     end loop;
     COMMIT;
     EXCEPTION
       WHEN LE_ERROR THEN
         po_msg:=LS_ERRMSG;
         ROLLBACK;
       WHEN OTHERS THEN
         po_msg:='调用自动审核过程出错,请联系系统管理员:'||SUBSTR(SQLERRM,1,400);
         ROLLBACK;
  END WSBS_VALIDATE_DIRECTROY;
END PKG_DIRECTROYBUSINESS;

oracle中自定义type、以及java中传递list到过程中的例子的更多相关文章

  1. idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在,已解决

    idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在 1. 报错具体情况 2. Project Structure中的Libraries没有任何红色波浪线 3. 发现自己要引 ...

  2. Android中自定义veiw使用Java中的回调方法

    //------------------MainActivity----中---------------------------------- import android.os.Bundle;imp ...

  3. 如何解决tomcat中的应用报java.io.IOException: 您的主机中的软件中止了一个已建立的连接

    转载: 施勇: https://blog.csdn.net/shiyong1949/article/details/72845634 这两天突然看到日志文件中有“java.io.IOException ...

  4. ubuntu中出现:程序 'java' 已包含在下列软件包中的解决方法

    已经安装sun java 在终端中输入java,出现以下提示: 程序 'java' 已包含在下列软件包中: * default-jre * gcj-4.8-jre-headless * gcj-4.9 ...

  5. Javascript在ajax提交过程中页面显示加载中,请等待效果,并在提交过程中限制确定按钮防止多次提交,提交完成后,解除提交限制

    加载中,请等待div: <div id="load" class="center-in-center" style="display:none; ...

  6. Python中if __name__=="__main__" 语句在调用多进程Process过程中的作用分析

    2018年2月27日 于创B515 引言 最近准备学习一下如何使用Python中的多进程.在翻看相关书籍.网上资料时发现所有代码都含有if __name__=="__main__" ...

  7. Oracle-一张表中增加计算某列值重复的次数列,并且把表中其他列也显示出来,或者在显示过程中做一些过滤

    总结: 1.计算某列值(数值or字符串)重复的次数 select 列1,count( 列1 or *) count1  from table1 group by 列1 输出的表为:第一列是保留唯一值的 ...

  8. 再springMVC中自定义文件上传处理解决与原spring中MultipartResolve冲突问题

    相信很多朋友再用springmvc时都遇见了一个问题,那就是自带的获取上传的东西太慢,而且不知道如何修改,其实不然,spring框架既然给我们开放了这个接口,就一定遵从了可扩展性的原则,经过查看org ...

  9. input type file onchange上传文件的过程中,遇到同一个文件二次上传无效的问题。

    不要采用删除当前input[type=file]这个节点,然后再重新创建dom这种方案,这样是不合理的.解释如下:input[type=file]使用的是onchange去做,onchange监听的为 ...

随机推荐

  1. ios iphone、ipad启动画面尺寸

    以下是iphone.ipad启动画面的尺寸 iphone4(纵):320 x 480 iphone4 Retina(纵):640 x 960   iphone5(纵):320 x 568 iphone ...

  2. json写入到excel表

    1. 拼接返回的json数据 // 拼接需要下载报表的HTML,并返回html;reportHtml(reporttData) { let html = `<html xmlns:o=" ...

  3. 有关弱类型意识、DOM、动态语言与函数式编程

    一.弱类型意识  js变量是没有类型的 var a =1;   //a 就是一个变量  不要提类型 变量可以赋予任何类型的值,类型仅仅是值得性质  与变量无关   js 的基本类型 变量未赋值时,其值 ...

  4. jQuery UI dialog 参数说明

    前段时间碰到个问题 jquery UI dialog弹出层 弹出多个层是 比如弹出两个层A和B  B层如果显示的数据表格太大,伸到了A层的外面,那伸到A层之外的部分就看不到了,因为B层是在A层上弹出的 ...

  5. 【Python算法】渐进记法 与 性能测量工具cProfile

    对于某个比较简单的算法,我们有时候确实能够精确地分析出算法的复杂度. 比如算法复杂度为5n^2+10n+6,但是事实上并不需要这样,因为当n足够大时,可以忽略掉低阶项和最高次项的系数,因此就引出了“渐 ...

  6. python and 我爱自然语言处理

    曾经因为NLTK的 缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python.离 开腾讯创业后,第一个作品课程图谱也 ...

  7. Django系列

    1.Django框架 2.Django restframework 其他 django之contenttype

  8. 一个误区(关于javascript的字符串拼接)

    前段时间听说了一个问题,说是,javascript中使用+=来拼接字符串会比使用Array的join方法慢几十倍以上,今天在工作间歇,就写了个例 子验证了一下,结果确完全相反,使用+=比join要快( ...

  9. 将vi or vim中的内容复制到terminal中

    1. 查看 vim 是否支持 clipboard 功能 $ vim --version | grep clipboard 2. 如果有 +clipboard 则跳过这一步; 如果显示的是 -clipb ...

  10. Python标准库 之 turtle(海龟绘图)

    turtle库介绍 首先,turtle库是一个点线面的简单图像库(也被人们成为海龟绘图),在Python2.6之后被引入进来,能够完成一些比较简单的几何图像可视化.它就像一个小乌龟,在一个横轴为x.纵 ...