Ошибка загрузчика SQL: "поле переменной длины превышает максимальную длину."

у меня есть файл управления загрузчиком SQL,

LOAD DATA  
INFILE 'test.txt'  
INTO TABLE TEST replace  
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS  
( DOCUMENTID INTEGER(10),  
  CUSTID INTEGER(10),  
  USERID INTEGER(10),  
  FILENAME VARCHAR(255),  
  LABEL VARCHAR(50),  
  DESCRIPTION VARCHAR(2000),  
  POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="",  
  USERFILENAME VARCHAR(50),  
  STORAGEPATH VARCHAR(255)
)

и это дает мне ошибку, когда я запускаю SQL Loader на нем,
Record 1: Rejected - Error on table TEST, column FILENAME. Variable length field exceeds maximum length.

вот этот ряд.. длина этого столбца меньше 255..

1|5001572|2|/Storage/Test/5001572/test.pdf|test.pdf||2005-01-13 11:47:49||

и вот странность, которую я заметил в файле журнала

Column Name | Position | Len | Term | Encl | Datatype
FILENAME | NEXT | 257 | | | VARCHAR

Я определяю длину как 255 как в моей таблице, так и в файле управления. Но журнал выплевывает его как 257? Я пытался сбить длина в файле управления до 253, поэтому он отображается как 255 в файле журнала, но та же проблема.

помочь? Меня это уже два дня беспокоит.

спасибо.

2 ответов


не определяйте поля данных как VARCHAR2 и INTEGER. Используйте CHAR. Большую часть времени при загрузке данных из текстового файла вы хотите использовать CHAR или, возможно, DATE, хотя даже это преобразуется из текстовой формы. В большинстве случаев вам даже не нужен спецификатор длины. Длина поля CHAR по умолчанию равна 255. Ваш файл управления должен выглядеть примерно так:

LOAD DATA
INFILE 'test.txt'
INTO TABLE TEST replace
fields terminated "|" optionally enclosed by '"' TRAILING NULLCOLS
(DOCUMENTID,
CUSTID,
USERID ,
FILENAME,
LABEL,
DESCRIPTION CHAR(2000),
POSTDATE DATE "YYYY-MM-DD HH24:MI:SS" NULLIF POSTDATE="",
USERFILENAME,
STORAGEPATH)

+1 для DCookie, но для расширения этого важно различать типы данных, указанные в таблице, и типы данных в файле управления SQL*loader, поскольку они означают довольно разные вещи, смущая.

начните с взгляда на документация, и обратите внимание, что при загрузке обычных текстовых файлов вам нужно использовать "портативные" типы данных.

Varchar-это "непереносимый" тип, в котором:

... состоит из подполе двоичной длины, за которым следует символьная строка заданной длины

Итак, как говорит DCookie, CHAR-это то, что нужно, а INTEGER EXTERNAL-очень часто используемый тип данных SQL*Loader, который вы, вероятно, захотите указать для DOCUMENTID и т. д.