oracle中自定義type、以及java中傳遞list到過程當中的例子

在java開發過程當中有時候爲了處理數據的速度更快,會把要處理的數據組裝成list,把list做爲過程的一個參數,在過程當中批量處理,下面就以一個例子作簡單的闡述,以此謹記。java

--藥品目錄智能審覈web

--說明:藥品目錄上傳首先是保存在DB1建的臨時表中ka19_temp,最終通過調用webservice接口調用DB2的過程PKG_DIRECTROYBUSINESS.WSBS_VALIDATE_DIRECTROYsql

--建立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  //這裏至關於建立上面的一個記錄,即表的記錄oracle

 

--上面type建立好以後在java層調用過程就能夠對應使用--如下是配置webservice接口例子app

    /**
     * 驗證要保存的藥品目錄信息
     * @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;
    }oop

 

    /**
     * 根據數據庫中你的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做爲過程的一個參數 在過程當中遍歷的例子ui

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; 

相關文章
相關標籤/搜索