我从sql server获取数据,其中大多数列中的数据都有回车符和换行符。我需要使用回车和换行将它们加载到oracle中;基本上我必须将sql server 2012的数据镜像到oracle 11g。
下面是我的提取文件的样本
<#> [#BOR#] [#EOC#] 109 [#EOC#] 4 [#EOC#] testdata_Duplicate [#EOC#] testdata_Duplicate来自聊天[#EOC#]这个是
carriage return field[#EOC]test2[#EOR#]
这里[#EOC#]是列分隔符,[#EOR#]是行分隔符。 [#BOR#]表示行的开头。最初我的加载失败是由于平面文件中的空行(数据提取)。然后我使用[#BOR#]和continueIf保留子句,以便sqlldr不会将空行(cr / lf)视为物理行。
使用[#BOR#]作为填充列,我的加载工作正常,但回车或换行不会加载到oracle表中。
我的ctl文件如下
load data
truncate
CONTINUEIF NEXT preserve (1:7) <> "[#BOR#]"
into table sch1.tbl1
fields terminated by '[#EOC#]'
trailing nullcols (
field filler,
a_id integer external,
h_id integer external,
title char(128),
descn char(4000),
risk char(4000),
comment char(4000) terminated by '[#EOR#]')
在oracle sch1.tbl1表中,列冒险的数据为“这是回车字段”而不是 “这
是
carriage return field'
我尝试用字符串[#crlf#]替换char(10)并在ctl中使用replace函数,如下所示
load data
truncate
CONTINUEIF NEXT preserve (1:7) <> "[#BOR#]"
into table sch1.tbl1
fields terminated by '[#EOC#]'
trailing nullcols (
field filler,
a_id integer external,
h_id integer external,
title char(128),
descn char(4000),
risk char(4000) "replace(:risk,[#crlf#],chr(10))"
comment char(4000) terminated by '[#EOR#]')
sql loader错误说明SQL * Loader-309:不允许SQL字符串作为字段规范的一部分;我相信因为我的列是CLOB数据类型,所以我无法使用替换函数。
请帮助我使用sqlloader将带有cr / lnFeed的sql server中的数据加载到oracle表中。提前谢谢。
答案 0 :(得分:1)
这是适合我的解决方案。 不是用[#crlf#]替换提取的平面文件中的回车/换行符(cr / lf),而是在提取的数据文件中保留cr / lf。 然后我改变了我的ctl文件,用INFILE Clause处理cr / lf文件名和&#34; str&#39; \ n&#39; &#34 ;.对于Unix env,我们需要\ n,对于windows,我们可以使用\ n或\ r \ n。
见下文
load data INFILE 'filename.dat' "str '\n'"
truncate
CONTINUEIF NEXT preserve (1:7) <> "[#BOR#]"
into table sch1.tbl1
fields terminated by '[#EOC#]'
trailing nullcols (
field filler,
a_id integer external,
h_id integer external,
title char(128),
descn char(4000),
risk char(4000),
comment char(4000) terminated by '[#EOR#]')
我测试了它并且数据加载了cr \ lf ..我需要做更详细的测试,截至目前我测试了一个表我还有更多。 同时,如果任何人有更好的解决方案,我会非常乐意尝试。