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 24 Oracle
mybatis使用oracle进行添加数据的方法
Apr 27 Oracle
oracle通过存储过程上传list保存功能
May 12 Oracle
oracle覆盖导入dmp文件的2种方法
May 21 Oracle
Oracle11g R2 安装教程完整版
Jun 04 Oracle
oracle索引总结
Sep 25 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
分析SQL窗口函数之聚合窗口函数
Apr 21 Oracle
oracle数据库去除重复数据
May 20 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
Oracle数据库事务的开启与结束详解
Jun 25 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批量删除数据
2007/01/18 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
php获取excel文件数据
2017/04/21 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
python简单读取大文件的方法
2016/07/01 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
python 不以科学计数法输出的方法
2018/07/16 Python
Python闭包函数定义与用法分析
2018/07/20 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
shell变量的作用空间是什么
2013/08/17 面试题
自我评价的范文
2014/02/02 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
电子信息工程自荐信
2014/05/26 职场文书
关于教师节的广播稿
2014/09/10 职场文书
单位收入证明范本
2015/06/18 职场文书
导游词之河北邯郸
2019/09/12 职场文书