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
Oracle创建只读账号的详细步骤
Jun 07 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
Oracle表空间与权限的深入讲解
Nov 17 Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Nov 20 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
排查并解决Oracle sysaux表空间异常增长
Apr 20 Oracle
详解SQL的窗口函数
Apr 21 Oracle
分析SQL窗口函数之取值窗口函数
Apr 21 Oracle
清空 Oracle 安装记录并重新安装
Apr 26 Oracle
instantclient客户端 连接oracle数据库
Apr 26 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
php图像处理类实例
2015/07/28 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
js保存当前路径(cookies记录)
2010/12/14 Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
2014/12/31 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
Python中除法使用的注意事项
2014/08/21 Python
pyqt5实现登录界面的模板
2020/05/30 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
新闻学专业应届生求职信
2013/11/08 职场文书
高分子材料与工程专业推荐信
2013/12/01 职场文书
挂职自我鉴定
2014/02/26 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
2014年基建工作总结
2014/12/12 职场文书
本溪关门山导游词
2015/02/09 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书