从SQLoader到外部表[Oracle]

时间:2016-06-20 13:50:33

标签: oracle sql-loader external-tables

目前我有一些平面文件,用SQLoader加载到DB中,但是我想用外部表替换SQLoader脚本,但是我遇到了问题"翻译" SQLoader到外部表。

所以,例如我有一个平面文件,如下所示:

~#~col1>|col2>|col3...

我有一个SQloader .ctl文件,看起来像这样:

LOAD DATA                                                                       
APPEND
CONTINUEIF NEXT PRESERVE (1:3) <> '~#~'
INTO TABLE my_tab
FIELDS TERMINATED BY ">|"  TRAILING NULLCOLS          
(                                                                               
  col1                 "LTRIM(Trim(:col1),'~#~')",
  col2                 "TRIM(:col2)",                                          
  col3                 "TRIM(:col3)",
  col4                  CONSTANT #$TASKID$#,
  col5                  CONSTANT #$SESSION$#,
  col6                  RECNUM,
  col7                  SEQUENCE(MAX)
)  

目前我尝试过很多东西 -

create table my_tab(
   col1    varchar2(100) 
  ,col2    number(38)         
  ,col3    number(38)
  ,... 
)
organization external(
  type oracle_loader
    default directory my_dir
    access parameters(
      records delimited by newline
      fields terminated by '>|' 
      missing field values are null
      reject rows with all null fields
    )
    location('my_file.txt')
 );

所以我有一个问题:

在定义外部表时如何调用TRIM函数? (它甚至可能吗?)或者唯一的方法是为数据暂存创建另一个视图/表,并进行所有数据转换然后将数据插入目标表?

提前致谢!

1 个答案:

答案 0 :(得分:0)

假设您的记录始终以~#~开头,您可以使用几个不会映射到表定义的虚拟列来使用它:

create table my_tab(
   col1    varchar2(100) 
  ,col2    number(38)         
  ,col3    number(38)
)
organization external(
  type oracle_loader
    default directory my_dir
    access parameters(
      records delimited by newline
      fields terminated by '>|' 
      missing field values are null
      reject rows with all null fields
      (
        colx char(1) terminated by "~",
        coly char(1) terminated by "~",
        col1,
        col2,
        col3
      )
    )
    location('my_file.txt')
 );

没有trim clause specified的默认行为是LDRTRIM,其行为与SQL * Loader&#39; s TRIM的行为相同。您还可以将其设置为NOTRIM,以指定每列的空白修剪。

如果你想丢弃你的EOF标记记录但是加载其他所有内容你可以使用LOAD WHEN option,如果你不想记录它们,可选择NODISCARDFILE

...
organization external(
  type oracle_loader
    default directory d42
    access parameters(
      records delimited by newline
      load when (1:15) != "###~~~EOF~~~###"
      nodiscardfile
      fields terminated by '>|' 
...