我有数百个数据文件都具有相同的结构,并且都需要加载到同一个表中。但是,表中有一个名为“filename”的额外列,我应该存储从那里加载数据的.dat文件的名称。
我知道我可以为每个.dat文件创建一个单独的控制文件,但这很难。任何人都可以建议更好的方法或如何从dat文件列表生成控制文件吗?
答案 0 :(得分:1)
可能最简单的方法是使用不填充文件名列的单个控制文件,并在加载每个文件后使用SQLPlus执行更新,如:
UPDATE table SET filename='&1' WHERE filename IS NULL;
因此,每个新的行集都加载了filename的NULL值,然后将所有具有NULL的行更新为当前文件名。
答案 1 :(得分:0)
有一大堆代码here用于派生CTL文件,但这取决于你的操作系统。
#!/bin/sh
cd `dirname $0`
file=`ls -rt fullpathofmyfileindir/*.csv | tail -1`
filename=`basename $file`
f=`echo $filename | cut -c 9-16`
cat LOAD_0.CTL > $1.ctl
echo $1
echo 'NOTIF_FILE_DATE "TO_DATE('\'$f\'','\'YYYYMMDD\'')",' >> $1.ctl
echo 'FILE_NAME CONSTANT '$1',' >> $1.ctl
echo 'NOTIF_ID "NOTIF_SEQ.NEXTVAL")' >> $1.ctl
sqlldr migration9c/migration@AXOT01 control=$1.ctl log=$1.log data=$1
rm $1.ctl