java调用ORACLE存储过程时数组传参,返回数组

该博客主要展示了如何在Java中调用Oracle存储过程,传递和接收数组参数。通过解析文件内容,将数据分块并异步保存到数据库。在存储过程中,根据数组元素创建或更新SYJY_STUDENT和SYJY_STUDENTEXTINFO表的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    public String fileUpload() {
        LOG.info("接收文件:" + filedataFileName);
        int discode = 0;
        List<String[]> list = null;
        try {
            list = parseFile(filedata);
        } catch (Exception e) {
            discode = 1;
            resultString = ERROR;
            LOG.error("文件内容格式不正确!", e);
        }

        try {
            if (discode == 0)
            saveList(list);
            
//            int nunm = 100000;
//            
//            int part = (int) Math.ceil(1.0*list.size()/nunm);
//            for (int j = 1; j <= part; j++) {
//                final List<String[]> subList;
//                if(j!=part){
//                    subList = list.subList((j-1)*nunm, j*nunm);
//                }else{
//                    subList = list.subList((j-1)*nunm, list.size());
//                }
//                
//                new Thread() {
//                    @Override
//                    public void run() {
//                        try {
//                            saveList(subList);
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }.start();
//            }
        } catch (Exception e) {
            resultString = ERROR;
            LOG.error("数据入库保存失败!", e);
        }

        try {
            String filename = saveFile(discode, filedata);
            LOG.info("保存文件完毕:" + filename);
        } catch (IOException e) {
            LOG.error("文件保存失败!", e);
        }
        LOG.info("处理文件完毕:" + filedataFileName);
        return SUCCESS;
    }
    
    
    //保存信息
    private void saveList(List<String[]> list) throws Exception {

        int busType = Constants.Dic.BUSTYPE_SYJY;
        int initStutas = Constants.Dic.STUDENT_STUTAS_INIT;
        String pwd = CommStringUtil.makePasswordByIdNumber("123456");
        
        if (list != null && list.size() > 0) {
            Collection<String> codes = studentService.getExitStudentCode(); // 查询所有导入的学员编号
            Map<String, Integer> idnums = studentService.getExitStudent(); // 查询所有导入的idnum
            Map<String, Integer> areaOrg = studentService.getAreasOrg(); // 查询地区和组织机构的关系

            Collection<SaveUploadStuDto> stus = new HashSet<SaveUploadStuDto>();
            for (String[] content : list) {

                if(codes.contains(content[2])){ // 重复导入,跳过
                    repeatNum++;
                    continue;
                }
                
                SaveUploadStuDto stu = new SaveUploadStuDto();

                stu.setStudyTimes(0);
                stu.setStudentCode(content[2]);
                stu.setApplyDate(content[6]);
                stu.setBusType(busType);
                stu.setStatus(initStutas);
                stu.setBusOrg(areaOrg.get(content[5])); // 设置组织id
                
                if(idnums.containsKey(content[1])) { // 系统中存在的学员 , 保存ext信息
                    stu.setStuId(idnums.get(content[1]));
                    stu.setName(null);
                    stu.setIdNumber(null);
                    stu.setTrianType(null);
                    stu.setPhone(null);
                    stu.setAreacode(null);
                    stu.setSex(null);
                    stu.setBirthdate(null);
                    stu.setPassword(null);
                }else{ // 系统中不存在的学员, 保存学员信息和ext信息
                    stu.setStuId(null);
                    stu.setName(content[0]);
                    stu.setIdNumber(content[1]);
                    if(0 != content[3].length()){
                        stu.setTrianType(content[3]);
                    }else{
                        stu.setTrianType(null);
                    }
                    if(0 != content[4].length()){
                        stu.setPhone(content[4]);
                    }else{
                        stu.setPhone(null);
                    }
                    
                    stu.setAreacode(content[5]);

                    stu.setSex(getSexByIdnum(stu.getIdNumber(), stu.getStudentCode()));
                    stu.setBirthdate(getBirthdate(stu.getIdNumber(), stu.getStudentCode()));
                    if("0000-00-00".equals(stu.getBirthdate())){
                        stu.setPassword(pwd); // 异常身份证,密码为123456
                    }else{
                        stu.setPassword(CommStringUtil.makePasswordByIdNumber(stu.getIdNumber()));
                    }
                }
                stus.add(stu);
                
            }
            if(stus.size() > 0){
                successNum = stus.size();
                studentService.saveSynStudents(stus);
            }
            
        }
    }
    
    @Override
    public boolean saveSynStudents(Collection<SaveUploadStuDto> stus) {
        return studentDao.saveSynStudents(stus);
    }
    
    
     private Connection getConn() throws Exception {
         return ((PoolableConnection) dataSource.getConnection().getMetaData().getConnection()).getDelegate();
     }
    
    private static ARRAY getOracleArr(Connection conn, String OracleObj,
            String Oraclelist, Collection<SaveUploadStuDto> stus)
            throws Exception {
        
           ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,conn);
           
           StructDescriptor structdesc = new StructDescriptor(OracleObj, conn);
           STRUCT[] structs = new STRUCT[stus.size()];
           int i = 0;
            for (SaveUploadStuDto stu : stus) {
                try {
                    Object[] result = {
                            stu.getStuId(),stu.getBusOrg(),stu.getStudyTimes(),stu.getStudentCode(),stu.getApplyDate(),stu.getBusType(),
                            stu.getStatus(),stu.getName(),stu.getIdNumber(),stu.getTrianType(),stu.getPhone(),stu.getAreacode(),stu.getSex(),
                            stu.getBirthdate(),stu.getPassword()
                    };
                    structs[i] = new STRUCT(structdesc, conn, result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                i++;
            }
        
        return new ARRAY(desc, conn, structs);
        
    }
    
    @Override
    public boolean saveSynStudents(Collection<SaveUploadStuDto> stus) {

        boolean rs = true;
        try {

            Connection conn  = getConn();
            
            ARRAY array_ = getOracleArr(conn, "SAVEUPLOADSTUDTO", "SAVEUPLOADSTUDTOLIST", stus);
            
            
            CallableStatement stmt = conn.prepareCall("{call saveuploadstu(?, ?, ?)}");
            conn.setAutoCommit(false);
            stmt.setArray(1, array_);
            stmt.registerOutParameter(2, Types.VARCHAR);
            stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);

            stmt.execute();

            String mName = stmt.getString(2);
            
            ResultSet insertedStu = (ResultSet) stmt.getObject(3);

            while(insertedStu.next()){
/*                Object s1 = insertedStu.getObject(1);
                Object s2 = insertedStu.getObject(2);*/
            }
            
            System.out.println("从oracle存储过程返回的结果:____________" + mName+"____________操作成功!".equals(mName));
            
            conn.commit();

            stmt.close();
            
            
        } catch (Exception e) {
            e.printStackTrace();
            rs = false;
        }

        return rs;
    }
    
    
CREATE OR REPLACE TYPE "SAVEUPLOADSTUDTO" AS OBJECT
(
  STUID      NUMBER,
  BUSORG     NUMBER,
  STUDYTIMES NUMBER,
  STUCODE    NVARCHAR2(20),
  APPLYDATE  NVARCHAR2(20),
  BUSTYPE    NUMBER,
  STATUS     NUMBER,
  STUNAME    NVARCHAR2(20),
  IDNUMBER   NVARCHAR2(20),
  TRIANTYPE  NVARCHAR2(20),
  PHONE      NUMBER,
  AREACODE   NVARCHAR2(20),
  SEX        NVARCHAR2(10),
  BIRTHDATE  NVARCHAR2(20),
  PASSWORD   NVARCHAR2(50)
)

CREATE OR REPLACE TYPE "SAVEUPLOADSTUDTOLIST" AS TABLE OF saveuploadstudto

CREATE OR REPLACE PACKAGE SYJY_PACKAGE AS
  TYPE SAVE_STU_CURSOR IS REF CURSOR;
END SYJY_PACKAGE;


CREATE OR REPLACE PROCEDURE SAVEUPLOADSTU(LIST_      IN SAVEUPLOADSTUDTOLIST,
                                          RS         OUT VARCHAR2,
                                          STU_CURSOR OUT SYJY_PACKAGE.SAVE_STU_CURSOR) IS
  STU_ID     NUMBER;
  STU_EXT_ID NUMBER;

BEGIN

  FOR I IN 1 .. LIST_.COUNT() LOOP
 
    IF (LIST_(I).STUID IS NOT NULL) THEN
      SELECT SEQ_STUDENT.NEXTVAL INTO STU_EXT_ID FROM DUAL;
    
      INSERT INTO SYJY_STUDENTEXTINFO
        (ID,
         STUDENT_ID,
         APPLYDATE,
         BUSTYPE,
         CREATETIME,
         STUDENTCODE,
         STATUS,
         BUSORG_ID,
         STUDYHOURS)
      VALUES
        (STU_EXT_ID,
         LIST_     (I).STUID,
         LIST_     (I).APPLYDATE,
         LIST_     (I).BUSTYPE,
         SYSDATE,
         LIST_     (I).STUCODE,
         LIST_     (I).STATUS,
         LIST_     (I).BUSORG,
         0);
    ELSE
    
      SELECT SEQ_STUDENT.NEXTVAL INTO STU_ID FROM DUAL;
    
      SELECT SEQ_STUDENT.NEXTVAL INTO STU_EXT_ID FROM DUAL;
    
      INSERT INTO SYJY_STUDENT
        (ID,
         BIRTHDATE,
         IDNUMBER,
         NAME,
         PASSWORD,
         PHONE,
         SAVETIME,
         AREACODE,
         SEX,
         TRIANTYPE)
      VALUES
        (STU_ID,
         LIST_  (I).BIRTHDATE,
         LIST_  (I).IDNUMBER,
         LIST_  (I).STUNAME,
         LIST_  (I).PASSWORD,
         LIST_  (I).PHONE,
         SYSDATE,
         LIST_  (I).AREACODE,
         LIST_  (I).SEX,
         LIST_  (I).TRIANTYPE);
    
      INSERT INTO SYJY_STUDENTEXTINFO
        (ID,
         STUDENT_ID,
         APPLYDATE,
         BUSTYPE,
         CREATETIME,
         STUDENTCODE,
         STATUS,
         BUSORG_ID,
         STUDYHOURS)
      VALUES
        (STU_EXT_ID,
         STU_ID,
         LIST_     (I).APPLYDATE,
         LIST_     (I).BUSTYPE,
         SYSDATE,
         LIST_     (I).STUCODE,
         LIST_     (I).STATUS,
         LIST_     (I).BUSORG,
         0);
    END IF;
  END LOOP;

  OPEN STU_CURSOR FOR
    SELECT STU_ID, STU_EXT_ID FROM DUAL;

  RS := '操作成功!';

END SAVEUPLOADSTU;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值