在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. Qt slot中获取sender

    调用sender();函数 例如获取一个QRadioButton QRadioButton *rb = qobject_cast<QRadioButton *>(sender());

  2. 在scrollview中双击定点放大的代码

    双击放大是 iPhone 的一个基本操作,第三方程序里引入这一功能的话,主要是在 scrollview 呈现一张图片或者 PDF 页面时,双击可以放大,主要代码如下 - (void)scrollVie ...

  3. Xamarin绑定微信SDK 实现分享功能

    从开始做这一块的工作开始,就开始找各种的资料,最后还是老老实实的去看官方文档. 对于Xamarin.Android的绑定属于纯jar的绑定,这个难度较小,添加Bindings Library,将lib ...

  4. c#基础 第六讲

    烧开水 先询问:“是否要烧开水(Y/N)” 是的话执行--0°--100°(30°---水温了,50°---水热了,80°---水快开了,100°---水已经开了, 结束.) 判断 循环 选择 跳转 ...

  5. Imageview如何设置背景颜色

    ImageView.setBackgroundColor(android.graphics.Color.parseColor("#ffffff")); ImageView.setB ...

  6. 电力项目十四--js添加highslider特效

    当页面的一个table表格无法显示所有的内容的时候,点击[查看详细信息],显示详细内容: 下载css,js 1.在actingIndex.jsp中添加:引入js和css: <LINK href= ...

  7. PHP 开发环境的搭建和使用03-- 安装mySql

    1/  安装的MySQL版本是5.6.10版本的,直接点击Install 2/ 选择 Execute 3/  更新最新版本成功后,选择 "next" 4/  自定义安装方式,选择C ...

  8. ionic 上拉加载问题(分页)

    问题描述: 1.第一初始化时执行了上拉加载更多. 2.上拉时存在执行多次加载动作. angularjs的ajax不提供同步机制,是为了防止页面长时间等待,很多时候我们又需要这种同步机制交换状态,比如上 ...

  9. RTB的颠覆性在于广告位不再是广告交易的标的,广告受众才是

    2014-09-15 PMP私有交易市场——程序化广告的新高度 | 互联网分析在中国——从基础到前沿 http://www.chinawebanalytics.cn/pmp-new-level-of- ...

  10. win10 计算器calc命令打不开

    解决方法: 1.用管理员身份运行WindowsPowerShell: 2.用控制台命令Get-AppxPackage读取微软应用列表: 3.找到NAME那里有Windows calculator的,这 ...