Oracle sqlldr: столбец здесь запрещен

Может ли кто-нибудь заметить ошибку в этой попытке загрузки данных? '\\N' потому, что это импорт дампа OUTFILE из mysql, который помещает \ N для полей NULL.

Декодирование предназначено для выявления случаев, когда поле может быть пустой строкой или содержать \ N.

Использование Oracle 10g в Linux.

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

person wadesworld    schedule 12.03.2010    source источник


Ответы (1)


BLANKS - это ключевое слово SQL * Loader, которое нельзя использовать в decode операторе SQL - оно обрабатывается как имя столбца. Если это действительно пустая строка (нулевой длины), как это вполне может быть в случае файла с разделителями, в decode вы можете использовать '' вместо BLANKS; но Oracle в любом случае рассматривает это как null. В этом случае decode должен быть избыточным, и вы можете просто использовать NULLIF, как и для других столбцов. Если «пустая» строка на самом деле состоит из одного или нескольких пробелов, вы можете сделать что-то вроде decode(TRIM(:PRIORITY),'',NULL,'\\N',NULL,:PRIORITY). (В любом случае вам понадобится последнее предложение по умолчанию для decode, иначе все значения станут нулевыми.)

person Alex Poole    schedule 13.03.2010