Oracle 11.2 SQL Loader:如何设置DAT文件的行终止符字符串,该名称是在命令行而不是CTL文件中传递给SQLLDR的?

时间:2014-09-14 21:23:40

标签: oracle csv sql-loader

问题:如何(在哪里)我可以指定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中未解决的问题相同。

2 个答案:

答案 0 :(得分:1)

不可否认,更多的解决方法而不是正确的解决方案,但如果您在控制文件中有固定名称,然后将每个文件复制/重命名/ sym链接到固定名称和进程,它应该可以工作。或者,让控件具有一个infile条目" THE_DAT_FILE",然后运行" sed"将其更改为所需的文件名,然后使用此sed&f文件调用sqlldr。

所以,比如:

  1. 获取数据文件F1
  2. 复制/ SymLink F1到the_file.dat(sym link asuming Unix / Linux / Cygwin)Admi
  3. 使用STR的RUn sqlldr将INFILE称为" the_file.dat"
  4. 完成后,删除/取消链接the_file.dat
  5. 对下一个文件F1,F2,... Fn
  6. 重复1-4

    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选项指定实际的平面文件。