oracle通过存储过程上传list保存功能


Posted in Oracle onMay 12, 2021

一、创建oracle 需要保存的数据类型type和存储过程produce

create TYPE "AL01TYPE"                                                                                                                                                                                                                                  as object
(
-- 描述 : 档案批量转出
-- 作者  : dt
-- 时间 : 2021-05-10
-- 版本 :dev-1.0.1
 
  aac003       NVARCHAR2(100), 
  aac002       NVARCHAR2(50), 
  aat001       NVARCHAR2(50), 
  aat002       NVARCHAR2(50), 
  aat013       NVARCHAR2(20), 
  aae011       NVARCHAR2(20), 
  aae036       NVARCHAR2(20), 
  aah002       NVARCHAR2(100) 
);
 
create type AL01TYPELIST as table of AL01TYPE;
 
-- auto-generated definition
create PROCEDURE SP_HFSZHDA_DOUPLOADAL01(LIST   IN   AL01TYPELIST,
                                       po_message OUT VARCHAR) IS
                                       --描述:档案转出excel上传
                                       --作者:dt
                                       --时间:2021-05-10
                                       --版本:dev-1.0.1
  v_object    AL01TYPE;
  le_error EXCEPTION;
  P_renum number(20);
 
  v_aah002  VARCHAR(100);
  ls_count number;
  ls_aaf025 VARCHAR(50);
 
BEGIN
  P_renum  := 0; --初始化
 
  FOR I IN 1 ..  LIST.count LOOP
    P_renum := 1 + P_renum;
 
      v_object := LIST(I);
 
 
       select   replace(utl_raw.cast_to_varchar2(utl_raw.cast_to_raw(v_object.aah002)),unistr('\0000'))  into  v_aah002 from   dual;
 
      begin
        Select count(0) into ls_count from az03 where aat001 = v_object.aat001 AND aat012 = '1';
        if ls_count=0 then
           po_message := '号:'||v_object.aat001||' 状态异常请核对后再上传!';
           RAISE le_error;
           end if;
 
         Select count(0) into ls_count From AL01 where aaj022='1' and aat001=v_object.aat001 and aah002=v_aah002;
         if ls_count =0 then
        -- 开始插入信息
      select  SQ_AAF025.nextval into ls_aaf025 from dual;
 
      insert into AL01(
      aaf025,
      aat012,
      aat001,
      aac003,
      aac002,
      aat002,
      aat013,
      aaj022,
      aaj026,
      aae011,
      aae036,
      aah002)values(
                 ls_aaf025,
                 '1',
                 v_object.aat001,
                 v_object.aac003 ,
                 v_object.aac002 ,
                 v_object.aat002 ,
                 v_object.aat013,
                 '1',
                 'excel上传数据',
                 v_object.aae011,
                 v_object.aae036,
                 v_aah002
            );
            
            end if;
 
    IF P_renum >1000 THEN
            commit;
            P_renum:=0;
        END IF;
      po_message :='ok';
EXCEPTION
                   WHEN le_error THEN
                   NULL;
                   WHEN OTHERS THEN
                   ROLLBACK;
                   po_message := '上传失败' || SQLCODE || SQLERRM;
        end;
 
 
  END LOOP;
  COMMIT;
 
END SP_HFSZHDA_DOUPLOADAL01;

二、通过过程上传list

package com.cominfo.elecfile.utils;
 
import oracle.jdbc.OracleConnection;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
import org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor;
 
import java.sql.Connection;
import java.util.List;
 
/**
 * 描述
 *
 * @Auther: dt
 * @Date: 2021/5/10 0027 09:00
 */
public class OracleUtil {
    /**
     * 根据数据库中你的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<Object[]> arrList = new ArrayList<>();
        //解析数据datamap
        for (Map<String, String> dataMap : dataMaps) {
            //创建保存对象
            Object[] objects =new Object[]{
 
                    dataMap.get("aac003"),
                    dataMap.get("aac002"),
                    dataMap.get("aat001").trim(),
                    dataMap.get("aat002"),
                    dataMap.get("aat013"),
                    'admin',
                    DateUtil.getCurrentTimeStr(),
                    'ec-20210510-wcdedgk2091',
 
            };
            arrList.add(objects);
 
        }
 
 
 
//开始调用过程
        long startTime=System.currentTimeMillis();
        Connection connection = null;
        CallableStatement sqlres = null;
        String sql = "call SP_HFSZHDA_DOUPLOADAL01(?,?)";
        String msg = "";
        try {
            connection = dataSource.getConnection();
            ARRAY paramArr = OracleUtil.getArray(connection,"AL01TYPE","AL01TYPELIST",arrList);
 
            sqlres = connection.prepareCall(sql);
            sqlres.setArray(1, paramArr);
            sqlres.registerOutParameter(2, Types.VARCHAR);
            sqlres.execute();
            msg = sqlres.getString(2);
 
            long endTime=System.currentTimeMillis()-startTime;
            System.out.println("上传后获取的返回参数为:"+msg+"||耗时:"+endTime/1000+"秒");
 
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if (sqlres != null) {
                    sqlres.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            if (!"ok".equals(msg)){
                throw new BusinessException("上传失败!"+msg);
            }
        }

到此这篇关于oracle通过存储过程上传list保存功能的文章就介绍到这了,更多相关oracle保存list内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
Oracle设置DB、监听和EM开机启动的方法
Apr 25 Oracle
mybatis使用oracle进行添加数据的方法
Apr 27 Oracle
使用springboot暴露oracle数据接口的问题
May 07 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
Oracle表空间与权限的深入讲解
Nov 17 Oracle
Oracle中update和select 关联操作
Jan 18 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 Oracle
Oracle数据库中通用的函数实例详解
Mar 25 Oracle
详解SQL的窗口函数
Apr 21 Oracle
使用springboot暴露oracle数据接口的问题
mybatis使用oracle进行添加数据的方法
Apr 27 #Oracle
Oracle设置DB、监听和EM开机启动的方法
oracle表分区的概念及操作
Apr 24 #Oracle
Oracle 数据仓库ETL技术之多表插入语句的示例详解
ORACLE数据库对long类型字段进行模糊匹配的解决思路
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 #Oracle
You might like
解析ajax事件的调用顺序
2013/06/17 PHP
php二分查找二种实现示例
2014/03/12 PHP
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
Node.js模块加载详解
2014/08/16 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
Python多进程fork()函数详解
2019/02/22 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
Python新手如何理解循环加载模块
2020/05/29 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
世界上最好的足球商店:Unisport
2019/03/02 全球购物
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
运动会广播稿80字
2014/01/23 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL
浅谈MySQL之select优化方案
2021/08/07 MySQL
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android