这里不允许使用Oracle sqlldr:列

时间:2010-03-12 21:29:58

标签: oracle oracle10g sql-loader ora-00984

任何人都可以发现此次尝试数据加载中的错误吗? '\\N'是因为这是从mysql导入的OUTFILE转储,它为NULL字段放置\ N。

解码用于捕获字段可能为空字符串的情况,或者可能具有\ N。

在Linux上使用Oracle 10g。

load data
infile objects.txt
discardfile objects.dsc
truncate
into table objects
fields terminated by x'1F'
optionally enclosed by '"'
(ID INTEGER EXTERNAL NULLIF (ID='\\N'), 
TITLE CHAR(128) NULLIF (TITLE='\\N'),
PRIORITY CHAR(16) "decode(:PRIORITY, BLANKS, NULL, '\\N', NULL)", 
STATUS CHAR(64) "decode(:STATUS, BLANKS, NULL, '\\N', NULL)", 
ORIG_DATE DATE "YYYY-MM-DD HH:MM:SS" NULLIF (ORIG_DATE='\\N'), 
LASTMOD DATE "YYYY-MM-DD HH:MM:SS" NULLIF (LASTMOD='\\N'), 
SUBMITTER CHAR(128) NULLIF (SUBMITTER='\\N'), 
DEVELOPER CHAR(128) NULLIF (DEVELOPER='\\N'), 
ARCHIVE CHAR(4000) NULLIF (ARCHIVE='\\N'), 
SEVERITY CHAR(64) "decode(:SEVERITY, BLANKS, NULL, '\\N', NULL)", 
VALUED CHAR(4000) NULLIF (VALUED='\\N'), 
SRD DATE "YYYY-MM-DD" NULLIF (SRD='\\N'), 
TAG CHAR(64) NULLIF (TAG='\\N')
)

样本数据(记录1)。 ^ _表示不可打印的0x1F分隔符。

1987^_Component 1987^_\N^_Done^_2002-10-16 01:51:44^_2002-10-16 01:51:44^_import^_badger^_N^_^_N^_0000-00-00^_none

错误:

Record 1: Rejected - Error on table objects, column SEVERITY.
ORA-00984: column not allowed here

1 个答案:

答案 0 :(得分:0)

BLANKS是SQL * Loader关键字,不是您可以在decode SQL语句中使用的 - 它将其视为列名。如果它确实是一个空(零长度)字符串,就像在分隔文件中的情况一样,在decode中你可以使用''而不是BLANKS;但Oracle无论如何都将其视为null。在这种情况下,decode应该是多余的,您可以像其他列一样使用NULLIF。如果'empty'字符串实际上是一个或多个空格,则可以执行decode(TRIM(:PRIORITY),'',NULL,'\\N',NULL,:PRIORITY)之类的操作。 (无论如何,您需要decode的最终默认子句,否则所有值都将为null。)