如何告诉sqlldr去掉前导和尾随空格

4

我正在使用sqlldr加载数据,其中一些字段具有尾随和前导空格。除了通过以下方式之外,是否有一种告诉sqlldr忽略这些空格的方法:

field "trim(:field)"

?


2
实际上,默认情况下,如果没有选择 PRESERVE BLANKS 选项,前导和尾随空格将被忽略。我的问题源于我使用的一个在 sqlldr 之上的工具生成 ctl 文件,默认添加了 PRESERVE BLANKS 选项。 - Isaac Kleinman
事实证明,默认情况下会忽略前导和尾随空格,但仅适用于某些数据类型。然而,一些类型如VARCHAR将保留空格不变。请参见下面的链接 http://www.csee.umbc.edu/portal/help/oracle8/server.815/a67792/ch05.htm#5817 - Mark F Guerra
2个回答

4

在大多数情况下,字段“trim(:field)”可以正常工作,但我遇到了一个典型的情况:列的大小为char(1),但控制文件中的数据却是' Y',而“trim(:field)”无法加载该数据。 经过大量研究,我得知trim()函数会从数据中去除空格,但同时会在数据中添加null值来替代空格,因此在上述示例中,数据长度将为2,因为它计算左侧数据中的null值。因此,数据将类似于nullY,由于表中的列大小小于实际大小,因此无法加载,并且Oracle会显示错误消息。 为了解决这个问题,我使用了以下方法: "trim(null from trim(:field))"

上面的脚本首先去除空格,然后再次去除sql-loader附加的null。

我希望提供的信息对任何遇到类似问题的人都有帮助,因为我没有找到任何回答这种问题的线程。


我很好奇,不过看起来如果你通过执行select trim(null from trim(' food')) from dual来测试它,它似乎不起作用。 它在sqlloader中的工作方式是否不同? - Reimius

1

我知道这是个老帖子,但我仍然想要发表意见。

就像许多事情一样,“这取决于。” 这取决于数据是否为固定格式或分隔符格式。 如果是分隔符格式,则还取决于控制文件是否使用了“OPTIONALLY ENCLOSED BY”子句。 有关所有详细信息,请参见Oracle SQL*Loader文档。例如,请尝试此链接:http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_field_list.htm#i1007768


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接