0

目前我有一些平面文件,它们使用 SQLoader 加载到数据库中,但我想用外部表替换 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函数?(甚至可能吗?)或者唯一的方法是为数据暂存创建另一个视图/表,并进行所有数据转换,然后将数据插入目标表?

提前致谢!

4

1 回答 1

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 子句的默认行为是LDRTRIM,其行为与 SQL*Loader 的 相同TRIM。您还可以将其设置NOTRIM为指定每列的空白修剪。


如果您想丢弃您的 EOF 标记记录但加载您可以使用LOAD WHEN选项的所有其他内容,NODISCARDFILE如果您不想保留它们的记录,则可以选择使用:

...
organization external(
  type oracle_loader
    default directory d42
    access parameters(
      records delimited by newline
      load when (1:15) != "###~~~EOF~~~###"
      nodiscardfile
      fields terminated by '>|' 
...
于 2016-06-20T18:55:28.847 回答