通过SQL加载器的多个文件



通过SQL Loader实用程序-在Oracle表中加载数据有两个要求

要求1

两个.csv文件中都定义了相同的头文件。跳过两者的标题,并将组合数据加载到表中。

如果两个文件中的任何一个出现错误,通过跳过标头加载数据并停止进程的命令将是什么。

要求2

两个文件的属性分布在两个文件中,即
表主键-ID,名称
第一个文件中的Cols-ID,名称,Attr1

oracle表中将加载两个文件数据的列
ID、Name、Attr1、Attr2

在这种情况下,从两个文件加载属性的最佳方式是什么?如何处理数据完整性场景?即如果第一个文件对应的记录是坏记录,则通知或不从第二个文件加载属性。

提前感谢。

按id排序文件,名称:

cat file1.txt | sort > file1.csv
cat file2.txt | sort > file2.csv

如果您需要描述标题,请使用grep-v:

cat file1.txt | grep -v "header id.." | sort > file1.csv
cat file2.txt | grep -v "header id.." | sort > file2.csv

然后使用awk:合并文件

awk 'BEGIN {FS=","}{getline line < "file1.csv"; print line","$3}' file2.csv > inputSqlLoader.csv

使用sql加载器加载结果文件。如果需要,可以在sql加载器上使用skip=1选项来丢弃标头。

为了提高性能,您可以使用:

paste -d, file{1..2}.csv | awk 'BEGIN {FS=","}{print $1","$2","$3","$6;}' > inputSqlLoader.csv

按照您的描述,SQL*Loader不是您选择的工具外部表,另一方面,可能不是。

为什么?因为SQL*加载器将加载第二个文件,而不管在第一个文件中发现什么错误。此外,您不能从两个文件加载;合并";数据转换为目标表中的单个记录。(好吧,它的背景仍然SQL加载器,但这不是重点(。

但是,如果这些CSV文件中的每一个都代表一个外部表,那么您可以使用SQL或更好的PL/SQL来访问它们。由于它是SQL的过程扩展,您可以创建一个过程;负载";(即INSERT(将第一个文件的内容放入目标表中。您将能够检查是否存在任何错误,然后使用UPDATEMERGE设置attr2列的值,继续执行第二个文件。

最新更新