sqlldr не распознает пустые столбцы, разделенные табуляцией

#sql-loader

#sql-загрузчик

Вопрос:

Я вижу странную проблему при загрузке моих данных с помощью sqlldr. Вот моя схема таблицы:

 CREATE TABLE TEST(
   "COL1" VARCHAR2 (255 BYTE),
   "COL2" VARCHAR2 (255 BYTE),
   "COL3" NUMBER,
   "COL4" VARCHAR2 (255 BYTE)
  

и вот только одна строка данных, которую я пытаюсь загрузить из файла, разделенного табуляцией test.txt:

 COL1    COL2    COL3    COL4
        10  17-cc
  

обратите внимание, что первые два столбца пусты (null). Итак, моя строка действительно:

 tt10t17-cc
  

мой скрипт загрузки:

 load data
 infile 'test.txt'
 append into table TEST
 fields terminated by "t" optionally enclosed by '"'
 TRAILING NULLCOLS  
(COL1,COL2,COL3,COL4)
  

Это будет загружено в мою таблицу как:

 COL1 COL2  COL3   COL4
10    17-CC (null) (null)
  

что неверно. похоже, что две ведущие вкладки в строке данных были проигнорированы, а COL3 позиция (10) была присвоена COL1. Однако, если я попытаюсь импортировать данные в виде файла, разделенного запятыми:

 COL1,COL2,COL3,COL4
,,10,17-cc
  

это работает так, как ожидалось. Почему версия с разделителями табуляции здесь терпит неудачу?

Ответ №1:

ПРИМЕЧАНИЕ — Исправлен мой первоначальный неправильный ответ.

Ваша ВКЛАДКА определена просто отлично. Вам нужен оператор NULLIF:

 load data
 infile 'test.txt'
 append into table TEST
 fields terminated by "t" optionally enclosed by '"'
 TRAILING NULLCOLS  
(COL1 NULLIF(COL1=BLANKS),
 COL2 NULLIF(COL2=BLANKS),
 COL3 NULLIF(COL3=BLANKS),
 COL4 NULLIF(COL4=BLANKS)
)
  

Комментарии:

1. Не уверен, что вы предлагаете. Можете ли вы уточнить или, возможно, показать, как должны выглядеть мои данные строки. Это файл, созданный Excel с разделителями табуляции. Кроме того, если я изменю свою строку на: «55 66 10 17- CC»строка, разделенная табуляцией, проглатывается без проблем. Это две ведущие вкладки для пустых столбцов COL1 и COL2 в моей исходной строке данных, которые вызывают проблему

2. Проблема не в этом. Если вы посмотрите на мой оригинальный пост, вы увидите, что в моей команде loader уже есть то, что вы предлагаете. Я даже заменил t на x ’09’ в качестве вашего предложения, но результат тот же. Опять же, проблема заключается в ячейках, содержащих нулевые значения. Загрузчик не пропускает эти столбцы должным образом.

3. Извините, мой первый ответ был неправильным. Пожалуйста, посмотрите правку выше.

4. Оператор NULLIF() это не исправляет. Я все еще получаю тот же результат. Пожалуйста, обратите внимание, что разделенная запятыми версия того же входного файла работает без операторов NULLIF(), поэтому проблема, должно быть, в чем-то другом.

5. Я выяснил, как заставить это работать. Мне пришлось удалить следующий элемент управления из моей команды sqlldr: необязательно заключенный в ‘»‘ . Не уверен, почему это вызвало проблему, но после ее удаления логика ведет себя так, как ожидалось.