目前我有一些平面文件,用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函数? (它甚至可能吗?)或者唯一的方法是为数据暂存创建另一个视图/表,并进行所有数据转换然后将数据插入目标表?
提前致谢!
答案 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 '>|'
...