2010-03-12 103 views
1

任何人都可以发现此尝试的数据加载错误吗? '\\N'是因为这是从mysql导入OUTFILE转储的,它将\ N作为NULL字段。Oracle sqlldr:列不允许在这里

解码是为了说明该字段可能为空字符串或可能具有\ 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 

回答

0

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