问题:如何(在哪里)我可以指定DAT文件的行终止符字符串,以防我使用“data”参数在命令行上传递DAT文件的名称而不是在CTL文件中?我正在使用Oracle 11.2 SQL Loader。
目标:我需要将大量数据从CSV文件加载到Oracle 11.2(或更高版本)中。字段(列)分隔符是hexa 1F(US字符=单位分隔符),字符串分隔符是双引号,记录(行)分隔符是hexa 1E(RS字符=记录分隔符)。
问题:对SQL Loader的“str terminator_string”使用“流记录格式”很好,但只是以防万一,我可以使用“infile”指定DAT文件的名称CTL中的指令。但是我的DAT文件的名称是变化的,所以我将命令行上的DAT文件的名称作为“数据参数”传递。在这种情况下我不知道,如何(在哪里)我可以指定DAT文件的行终止符字符串以防万一。
备注:问题与this question中未解决的问题相同。
答案 0 :(得分:1)
不可否认,更多的解决方法而不是正确的解决方案,但如果您在控制文件中有固定名称,然后将每个文件复制/重命名/ sym链接到固定名称和进程,它应该可以工作。或者,让控件具有一个infile条目" THE_DAT_FILE",然后运行" sed"将其更改为所需的文件名,然后使用此sed&f文件调用sqlldr。
所以,比如:
E.g。
for DAT_FILE in *.dat
do
ln -s $DAT_FILE /tmp/the_file.dat
sqlldr .....
rm /tmp/the_file.dat
done
或者
for DAT_FILE in *.dat
do
cat the_ctl_file | \
sed "s/THE_DAT_FILE/£DAT_FILE/" > /tmp/ctl_$DAT_FILE.cf
sqlldr ..... controlfile=tmp/ctl_$DAT_FILE.cf
done
答案 1 :(得分:0)
我遇到了类似的情况,我需要对一组文件使用相同的控制文件,所有文件都带有EOR的Windows EOL字符,文本字段中嵌入了换行符。
我没有使用INFILE指令上的名称为每个编码特定的控制文件编码,而是使用STR将名称编码为/ dev / null:
INFILE '/dev/null' "STR '\r\n'"
然后在sqlldr命令行上,我使用DATA选项指定实际的平面文件。