Ошибка загрузчика 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 и т. д.