在 Oracle 数据库表中加载多个数据文件

在本文中,我将展示 SQL 加载器 + Unix 脚本实用程序的强大功能,其中 SQL 加载器可以使用自动 shell 脚本加载多个数据文件。这在处理大量数据以及需要将数据从一个系统移动到另一个系统时非常有用。

它适合涉及大量历史数据的迁移项目。那么就不可能为每个文件运行 SQL 加载程序并等待其加载。因此,最好的选择是让包含 SQL 加载命令的 Unix 程序始终运行。一旦文件夹位置中有任何文件可用,它将从该文件夹位置拾取文件并立即开始处理。

设置

示例程序是我做的。在 Macbook 中,Oracle 的安装与 Windows 机器上的安装有所不同。

请观看包含如何在 Mac 上安装 Oracle 的详细步骤的视频。

让SQL 开发人员遵守 Java 8。

现在让我们来演示一下这个例子。

在 Oracle DB 表中加载多个数据文件

因为它是 Macbook,所以我必须在 Oracle 虚拟机内完成所有操作。

让我们看看下图 SQL Loader 是如何工作的。

图片

使用案例

需要使用 Shell 脚本 + SQL 加载器自动化将数百万学生的信息加载到学生表中。该脚本将始终在 Unix 服务器中运行并轮询。DAT 文件,一旦 DAT 文件就位,它将对其进行处理。另外,如果存在任何不良数据,则需要单独识别它们。

此类示例在需要加载数百万历史记录的迁移项目中非常有用。

  1. 从旧系统,将定期生成实时源(DAT 文件)并将其发送到新系统服务器。

  2. 在新系统中,服务器文件可用,并将使用自动化 Unix 脚本加载到数据库中。

  3. 现在让我们运行脚本,该脚本可以在Unix服务器上一直运行。为了实现这一点,整个代码被放入下面的 while 块中。

while true   [some logic]done

过程

1、我已复制以下文件夹中的所有文件+文件夹结构。

/home/oracle/Desktop/example-SQLdr/

2、请参阅以下文件(ls -lrth)

rwxr-xr-x. 1 oracle oinstall  147 Jul 23  2022 student.ctl-rwxr-xr-x. 1 oracle oinstall   53 Jul 23  2022 student_2.dat-rwxr-xr-x. 1 oracle oinstall  278 Dec  9 12:42 student_1.datdrwxr-xr-x. 2 oracle oinstall   48 Dec 24 09:46 BAD-rwxr-xr-x. 1 oracle oinstall 1.1K Dec 24 10:10 TestSqlLoader.shdrwxr-xr-x. 2 oracle oinstall   27 Dec 24 11:33 DISCARD-rw-------. 1 oracle oinstall 3.5K Dec 24 11:33 nohup.outdrwxr-xr-x. 2 oracle oinstall 4.0K Dec 24 11:33 TASKLOG-rwxr-xr-x. 1 oracle oinstall    0 Dec 24 12:25 all_data_file_list.unxdrwxr-xr-x. 2 oracle oinstall    6 Dec 24 12:29 ARCHIVE

3、如下图,student表中没有数据。

图片

4、现在使用以下命令运行脚本nohup.out ./TestSqlLoader.sh 通过这样做,它将始终在 Unix 服务器中运行。

5、现在脚本将运行,它将通过 SQL 加载器加载两个 .dat 文件。

6、该表应加载两个文件的内容。

图片

7、现在我再次删除表数据,只是为了证明脚本始终在服务器中运行,我将仅将两个 DAT 文件从 ARCHIVE 放置到当前目录。

图片

8、再次将这两个数据文件放入当前目录中。


-rwxr-xr-x. 1 oracle oinstall  147 Jul 23  2022 student.ctl-rwxr-xr-x. 1 oracle oinstall   53 Jul 23  2022 student_2.dat-rwxr-xr-x. 1 oracle oinstall  278 Dec  9 12:42 student_1.datdrwxr-xr-x. 2 oracle oinstall   48 Dec 24 09:46 BAD-rwxr-xr-x. 1 oracle oinstall 1.1K Dec 24 10:10 TestSqlLoader.shdrwxr-xr-x. 2 oracle oinstall   27 Dec 24 12:53 DISCARD-rw-------. 1 oracle oinstall 4.3K Dec 24 12:53 nohup.outdrwxr-xr-x. 2 oracle oinstall 4.0K Dec 24 12:53 TASKLOG-rwxr-xr-x. 1 oracle oinstall    0 Dec 24 13:02 all_data_file_list.unxdrwxr-xr-x. 2 oracle oinstall    6 Dec 24 13:03 ARCHIVE

9、再次看到 Student 表已加载所有数据。

图片

10、该脚本始终在服务器上运行


[oracle@localhost example-sqldr]$ ps -ef|grep Testoracle   30203     1  0 12:53?        00:00:00 /bin/bash ./TestSqlLoader.shoracle   31284 31227  0 13:06 pts/1    00:00:00 grep --color=auto Test

完整源代码供参考


#!/bin/bashbad_ext='.bad'
dis_ext='.dis'
data_ext='.dat'
log_ext='.log'
log_folder='TASKLOG'
arch_loc="ARCHIVE"
bad_loc="BAD"
discard_loc="DISCARD"
now=$(date +"%Y.%m.%d-%H.%M.%S")
log_file_name="$log_folder/TestSQLLoader_$now$log_ext"while true;
dols -a *.dat 2>/dev/null > all_data_file_list.unxfor i in `cat all_data_file_list.unx`do#echo "The data file name is :-- $i"data_file_name=`basename $i .dat`  echo "Before executing the sql loader command ||Starting of the script" > $log_file_name sqlldr userid=hr/oracle@orcl control=student.ctl errors=15000 log=$i$log_ext bindsize=512000000 readsize=500000 DATA=$data_file_name$data_ext BAD=$data_file_name$bad_ext DISCARD=$data_file_name$dis_extmv $data_file_name$data_ext $arch_loc 2>/dev/nullmv $data_file_name$bad_ext $bad_loc 2>/dev/nullmv $data_file_name$dis_ext $discard_loc 2>/dev/nullmv $data_file_name$data_ext$log_ext $log_folder 2>/dev/nullecho "After Executing the sql loader command||File moved successfully" >>  $log_file_namedone## halt the procesing for 2 minssleep 1mdone

CTL 文件如下。

OPTIONS (SKIP=1)LOAD DATAAPPENDINTO TABLE studentFIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'TRAILING NULLCOLS(id,name,dept_id)

SQL 加载器规范

1. control --> name of the .ctl file

2.errors=15000(SQL Loader 允许的最大错误数)

3.log=$i$log_ext(日志文件的名称)

4.bindsize=512000000(绑定数组的最大大小)

5.readsize=500000(最大大小) 

6. DATA=$data_file_name$data_ext(数据文件的名称和位置)

7. BAD=$data_file_name$bad_ext(坏文件的名称和位置)

8. DISCARD=$data_file_name$dis_ext(丢弃文件的名称和位置)

综上所述,这种方式可以通过SQL加载器+Unix脚本自动化的方式加载数百万条记录,以上参数可以根据需要设置。


作者:ARINDAM GOSWAMI

更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

irds.cn,多数据库管理平台(私有云)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/315990.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【unity知识点】实现延迟调用——InvokeRepeating Invoke CancelInvoke Coroutine使用介绍

文章目录 InvokeRepeating Invoke CancelInvokeCoroutine1. 使用协程(Coroutine)实现类似Invoke的延迟调用:2. 要使用协程(Coroutine)来实现类似于InvokeRepeating的重复调用效果3. 区别4. 补充 完结 InvokeRepeating …

golang编译失败:import cycle not allowed

在开发golang项目的时候,遇到了一个问题,在编译的时候,报错 原因,循环引入包 ginchat/models里面的问题 正常情况下 A包调用了B包,但是B包就不能再去调用A包了,这样就会报错 查看代码 utils调用了models包 而models包中又调用了utils包 解决办法一: 修改一下逻辑,尽量不让…

建立网络矩阵:选择迅腾文化提供定制集成化服务、专业团队支持与拓展销售渠道

建立网络矩阵:选择迅腾文化提供定制集成化服务、专业团队支持与拓展销售渠道 在当今高度互联的数字时代,网络矩阵已成为企业常态化运营工具。网络矩阵不仅仅是一个单一的网站,而是由多个相互关联的数字资产组成的整体结构,包括官…

K8S本地开发环境-minikube安装部署及实践

引言 在上一篇介绍了k8s的入门和实战,本章就来介绍一下在windows环境如何使用minikube搭建K8s集群,好了废话不多说,下面就和我一起了解Minikube吧。 什么是Minikube? Minikube 是一种轻量级的 Kubernetes 实现,可在本…

C语言 指针学习总结

C语言学习! 目录 前言 一、指针是什么? 1.1 指针变量 1.2 取地址运算符和间接寻址运算符 二、指针变量的大小 三、指针和指针类型 四、指针和函数 五、野指针 5.1 野指针成因 1. 指针未初始化 2. 指针越界访问 3. 指针指向的空间释放 5.2 如…

大创项目推荐 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…

中国银行 企业网上银行 相关注意事项合辑 不断更新中...

中国银行 企业客户网银登录 登录时需已安装 Windows 或 Mac “网上银行登录安全控件”, 并已阅读和同意 《中国银行电子银行客户安全服务保障须知》 。网银用户首次登录时,请使用柜台注册时获取的"网银登录用户名"登录。首次登录成功后&#x…

python使用动态规划解决不同路径问题

针对二维动态规划,还有一个问题就是关于求不同路径的实例,主要是说明在实际应用的场景中,要理解透彻实际问题的真正目的,就可以灵活实现代码编写。 对于求不同路径问题描述,对于一个机器人,处在一个mxn的网…

Jenkins怎么配置Publish over SSH,配置SSH Servers连接的两种方式

一、前提条件 jenkins必须已经安装好了publish over ssh的插件 二、方式一(使用密码连接) 1.打开Manager Jenkins的System配置 2.找到Publish over SSH配置项,点击add SSH Server增加一个ssh连接配置 3.填写ssh基本配置 4.点击高级,配置密码 5.点击 Test Configuration…

Maven 整理(含面试题)

Maven是Java 项目必备,Maven 主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。项目构建工具 、更好的管理依赖 目录 Maven安装与运行maven 重要知识点面试题 Maven安装与运行 Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理…

sql——窗口范围之partition by 与 order by

partition by 关键字 partition by 在开窗函数中,常用于表示某个分区,规则了数据的范围 order by 关键字 order by 常用于对分区内的数据进行排序,常见的情况下,order by还能规定sql语句的影响范围。 rows between unbounded …

【Python排序算法系列】—— 插入排序

​ ​ 🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 2023年度总结→ http://t.csdnimg.cn/yIeru 目录 插入排序 理解 过程演示: 插…