【问题标题】:Oracle 11.2 SQL Loader: How to set the line terminator string of DAT file, which name is passed to the SQLLDR on the command line and not in CTL file?Oracle 11.2 SQL Loader:如何设置 DAT 文件的行终止符字符串,哪个名称在命令行上传递给 SQLLDR 而不是在 CTL 文件中?
【发布时间】:2014-09-14 21:23:40
【问题描述】:

问题:我如何(在哪里)指定 DAT 文件的行终止符字符串,以防我使用“data”参数在命令行上传递 DAT 文件的名称而不是在 CTL 文件中?我正在使用 Oracle 11.2 SQL 加载器。

目标:我需要将大量数据从 CSV 文件快速加载到 Oracle 11.2(或更高版本)中。字段(列)分隔符为 hexa 1F(US 字符 = 单位分隔符),字符串分隔符为双引号,记录(行)分隔符为 hexa 1E(RS 字符 = 记录分隔符)。

问题:使用“流记录格式”和 SQL Loader 的“str terminator_string”很好,但只是以防万一,我可以使用“infile”指定 DAT 文件的名称CTL 中的指令。但是我的 DAT 文件的名称是不同的,所以我在命令行中将 DAT 文件的名称作为“数据参数”传递。在这种情况下,我不知道如何(在哪里)指定 DAT 文件的行终止符字符串以防万一。

备注:问题与this question中未解决的问题相同。

【问题讨论】:

    标签: oracle csv sql-loader


    【解决方案1】:

    诚然,这是一种解决方法,而不是适当的解决方案,但如果您在控制文件中有一个固定名称,然后将每个文件复制/重命名/符号链接到固定名称和进程,它应该可以工作。或者,拥有一个具有 infile 条目“THE_DAT_FILE”的控件,然后运行“sed”将其更改为所需的文件名,然后使用此 sed 文件调用 sqlldr。

    所以,类似:

    1. 获取数据文件F1
    2. 复制/SymLink F1 到 the_file.dat(假设 Unix/Linux/Cygwin 的符号链接)Admi
    3. 使用 STR 运行 sqlldr,将 INFILE 称为“the_file.dat”
    4. 完成后,删除/取消链接 the_file.dat
    5. 对下一个文件 F1、F2、... Fn 重复 1-4

    例如

    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
    

    【讨论】:

    • 是的,第二种情况(使用 sed)正是我已经解决的方法,但从我的角度来看,这是解决方法。我想,甲骨文(应该)有更好的解决方案,我不知道。关于上面的 sed 命令,由于 $dat_file 有完整路径,如“/tmp/dat_file_20140916074901.123456.dat”(目录、名称、日期时间、pid、后缀),并且目录有“/”字符,我需要使用!而是 / 作为搜索定义的分隔符,例如:sed 's!THE_DAT_FILE!£DAT_FILE!' ...
    【解决方案2】:

    我刚刚遇到了类似的情况,我需要对一组文件使用相同的控制文件,所有文件都使用 Windows EOL 字符用于 EOR,并在文本字段中嵌入换行符。

    我没有使用 INFILE 指令上的名称为每个控制文件编写特定的控制文件,而是将名称编码为 /dev/null,STR 为:

    INFILE '/dev/null' "STR '\r\n'"

    然后在 sqlldr 命令行上,我使用 DATA 选项来指定实际的平面文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多