关于Oracle中使用SQLLDR有时候会出现关于空格保留或去除的问题,就这个问题的解决方案有不少,但如果是由于参数设置问题,可能就本文所说的问题解决。

参考文章: http://blog.sina.com.cn/s/blog_701218960100l0gt.html

使用SQLLDR加载入库,一般就使用分隔符取值或者定长取值。使用分隔符取值时,空格是会保留的,而使用定长取值的时候就会自动去除空格(本文所说空格指内容前后的空格,不包括文字中的空格)。

关于参数“PRESERVE BLANKS

SQLLDR中有一个参数“PRESERVE BLANKS”,用于控制定长时的空格保留。

input file 是分隔符时,control file 中的 PRESERVE BLANKS 无效;
input file 是定长时,control file 中的 PRESERVE BLANKS 有效。

所以,定长取值时,可以加 PRESERVE BLANKS 这个参数,保留空格入库

可以在 TRUNCATE INTO TABLE 中加入该参数,全部字段都保留空格,如:

LOAD DATA 
CHARACTERSET 'UTF8'
INFILE '/home/a.dat' 
TRUNCATE PRESERVE BLANKS INTO TABLE A
(
a POSITION(1:5), 
b POSITION(6:11), 
d POSITION(12:13) 
)

也可以在字段后加如该参数,只保留该字段空格,如:

LOAD DATA 
INFILE '/home/a.dat' 
TRUNCATE INTO TABLE A
 (
 a POSITION(1:5), 
 b POSITION(6:11)  PRESERVE BLANKS , 
 d POSITION(12:13) 
 )

利用trim()去除空格

定长取值默认是自动去除空格的,而分隔符取值则会保留空格入库。所以,去除空格可以利用trim()函数。如:

LOAD DATA 
CHARACTERSET 'UTF8'
INFILE '/home/a.txt' 
TRUNCATE INTO TABLE A
FIELDS TERMINATED BY '|'
(
a "trim(:a)", 
b "trim(:b)", 
d "trim(:d)"
)

总结

对于SQLLDR保留或去除空格,可以分按如下操作:

  • 定长:
    • 保留:加入参数 PRESERVE BLANKS
    • 去除:默认去除,无需操作
  • 分隔符:
    • 保留:默认保留
    • 去除:使用trim()函数

本文由 小TiD笔记 发布在小TiD笔记,转载此文请保持文章完整性,并请附上文章来源(小TiD笔记)及本页链接。

原文链接: https://www.tidnotes.ga/2020/03/sql-sqlldr-kong.html
扫描分享到社交APP

发表评论

夜间模式