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笔记
Apr 05 Oracle
Oracle 数据仓库ETL技术之多表插入语句的示例详解
Apr 12 Oracle
oracle表分区的概念及操作
Apr 24 Oracle
Oracle设置DB、监听和EM开机启动的方法
Apr 25 Oracle
zabbix agent2 监控oracle数据库的方法
May 13 Oracle
使用Oracle跟踪文件的问题详解
Jun 28 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
分析SQL窗口函数之排名窗口函数
Apr 21 Oracle
SQL试题 使用窗口函数选出连续3天登录的用户
Apr 24 Oracle
Oracle删除归档日志及添加定时任务
Jun 28 Oracle
oracle设置密码复杂度及设置超时退出的功能
Jun 28 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
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
javascript 自定义事件初探
2009/08/21 Javascript
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
详解vue-element Tree树形控件填坑路
2019/03/26 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
Python实现点云投影到平面显示
2020/01/18 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
一些Unix笔试题和面试题
2013/01/22 面试题
交警作风整顿剖析材料
2014/10/11 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
地道战观后感300字
2015/06/04 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
身份证丢失证明
2015/06/19 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
python中的getter与setter你了解吗
2022/03/24 Python
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android
Python开发五子棋小游戏
2022/04/28 Python