我遇到了一个我认为相当普遍的问题,但是试图在" Oracle数据库10g2 Utilities_b14215.pdf"中找到它。没有帮助。在那之后,我已经浏览了很多线程但到目前为止没有运气。
我有一个制表符分隔的文件(x' 09')e。 G。 name,userid,persnr。用户ID的值以P
,R
或T
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}}开头,但显然不是问题。
我做错了什么?
答案 0 :(得分:0)
从SQL Loader docs起,WHEN
条件的左侧只能是完整的字段名称,例如USERID
或职位规范,例如(3:5)
。
虽然允许的内容不是很清楚 - 例如可以LIKE
作为运算符吗?
USERID LIKE 'P%'
我强烈怀疑它不能。
答案 1 :(得分:0)
我会将整个文件加载到与文件布局匹配的临时表中,然后运行一个过程,将所需的行插入到生产表中。这是一种更常用的方法,可以使用这样的标准来处理负载,而无需编辑源数据。
如果你可以预处理源文件,将userid移动到第一个字段或将userid的第一个字母复制到它自己的字段并构造WHEN,这样sqlldr会查看第一个位置(这将是导致sqlldr返回非零值,因为并非所有行都满足WHEN子句条件):
WHEN (1) = 'P'