Как реально пропустить обработку столбца? - PullRequest
2 голосов
/ 11 июня 2009

Для загрузки данных (из файла CSV) в базу данных Oracle я использую SQL * Loader.

В таблице, которая получает эти данные, есть столбец varchar2(500), который называется COMMENTS. По некоторым причинам я хочу игнорировать эту информацию из файла CSV. Таким образом, я написал этот контрольный файл:

Options (BindSize=10000000,Readsize=10000000,Rows=5000,Errors=100)
  Load Data
  Infile 'XXX.txt'
  Append into table T_XXX
  Fields Terminated By ';'
  TRAILING NULLCOLS
(
    ...
    COMMENTS FILLER,
    ...
)

Этот код, кажется, работает правильно, поскольку поле COMMENTS в базе данных всегда установлено на null.

Однако, если в моем CSV-файле есть запись, в которой соответствующее поле COMMENTS превышает ограничение в 500 символов, я получаю сообщение об ошибке от SQL * Loader:

Record 2: Rejected - Error on table T_XXX, column COMMENTS.
Field in data file exceeds maximum length

Есть ли способ действительно исключить обработку моих COMMENTS полей?

Ответы [ 2 ]

2 голосов
/ 11 июня 2009

Я не могу воспроизвести вашу проблему. Я использую Oracle 10.2.0.3.0 с SQL * Loader 10.2.0.1.

Вот мой тестовый пример:

SQL> CREATE TABLE test_sqlldr (
  2     ID NUMBER,
  3     comments VARCHAR2(20),
  4     id2 NUMBER
  5  );

Table created

Контрольный файл:

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments filler,
  id2
)

файл данных:

1;aaa;2
3;abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;4
5;bbb;6

Я использую команду sqlldr userid=xxx/yyy@zzz control=test.ctl и получаю все строки без ошибок:

SQL> select * from test_sqlldr;

        ID COMMENTS                    ID2
---------- -------------------- ----------
         1                               2
         3                               4
         5                               6

Вы можете попробовать другой подход, я получаю тот же желаемый результат со следующим контрольным файлом:

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments "substr(:comments,1,0)",
  id2
)

Обновление после комментария Роментаза : Я снова посмотрел на него и смог получить ту же ошибку, что и вы, когда размер столбца превысил 255 символов. Это связано с тем, что типом данных SQL * Loader по умолчанию является char (255). Если у вас есть столбец с большим количеством данных, вам придется указать длину. Следующий контрольный файл решил проблему для столбца с 300 символами:

LOAD DATA
INFILE test.data
INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
( id,
  comments filler char(4000),
  id2
)

Надеюсь, это поможет,

-
Винсент

1 голос
/ 30 июля 2009

Просто, чтобы предложить небольшое улучшение, вы можете попробовать что-то вроде:

LOAD DATA
IN FILE test.data INTO TABLE test_sqlldr
APPEND
FIELDS TERMINATED BY ';'TRAILING NULLCOLS
(
 id,
 comments char(4000) "substr(:comments, 1, 200)", 
 id2)

Теперь вы получите первые 200 символов (или любое число, указанное вами в этом месте) всех комментариев - если только некоторые из ваших входных записей не имеют значений для поля комментариев, которые превышают 4000 символов, в которых они будут отклонены загрузчиком с ошибкой «превышает максимальную длину», отмеченной ранее. Но при условии, что это редкость или нет, все записи будут загружены с некоторыми комментариями, усеченными до 200 символов.

Если вы перейдете char(4000), вы получите ошибку загрузчика SQL - есть предел того, насколько далеко вы можете оттолкнуть зверя.

...