1

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

解码是为了捕捉字段可能是空字符串或可能有 \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
4

1 回答 1

0

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

于 2010-03-13T00:13:10.660 回答