sqlloader:如何正确使用when子句中的substr?

时间:2017-09-07 12:02:51

标签: oracle11g sql-loader

我遇到了一个我认为相当普遍的问题,但是试图在" Oracle数据库10g2 Utilities_b14215.pdf"中找到它。没有帮助。在那之后,我已经浏览了很多线程但到目前为止没有运气。

我有一个制表符分隔的文件(x' 09')e。 G。 name,userid,persnr。用户ID的值以PRT e开头。 G。 P2198,P2199,R7288,T1229。

我只想加载包含以P开头的用户ID的记录。

使用像这样的控制文件隔离单个记录可以很好地工作:

OPTIONS (SKIP=1)
LOAD DATA
INFILE UserlistLoader.dat
APPEND
INTO TABLE Z_USERLIST
WHEN USERID = 'P2198'
FIELDS TERMINATED BY x'09'
TRAILING NULLCOLS
(name, userid, persnr)

但是在when子句中使用SUBSTR的每次尝试都失败了。

此:

OPTIONS (SKIP=1)
LOAD DATA
INFILE UserlistLoader.dat
APPEND
INTO TABLE Z_USERLIST
WHEN SUBSTR(USERID, 1, 1) = 'P'
FIELDS TERMINATED BY x'09'
TRAILING NULLCOLS
(name, userid, persnr)

以SQL * Loader-350结束:语法错误。

OPTIONS (SKIP=1)
LOAD DATA
INFILE UserlistLoader.dat
APPEND
INTO TABLE Z_USERLIST
WHEN "SUBSTR(:USERID, 1, 1)" = 'P'
FIELDS TERMINATED BY x'09'
TRAILING NULLCOLS
(name, userid, persnr)

以SQL * Loader-403结尾:表Z_USERLIST中不存在引用列USERID。

但它是现在 - 正如第一个例子证明的那样。我发现该列应该以{{1​​}}开头,但显然不是问题。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

SQL Loader docs起,WHEN条件的左侧只能是完整的字段名称,例如USERID或职位规范,例如(3:5)

虽然允许的内容不是很清楚 - 例如可以LIKE作为运算符吗?

USERID LIKE 'P%'

我强烈怀疑它不能。

答案 1 :(得分:0)

我会将整个文件加载到与文件布局匹配的临时表中,然后运行一个过程,将所需的行插入到生产表中。这是一种更常用的方法,可以使用这样的标准来处理负载,而无需编辑源数据。

如果你可以预处理源文件,将userid移动到第一个字段或将userid的第一个字母复制到它自己的字段并构造WHEN,这样sqlldr会查看第一个位置(这将是导致sqlldr返回非零值,因为并非所有行都满足WHEN子句条件):

WHEN (1) = 'P'