#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: необязательно заключенный в ‘»‘ . Не уверен, почему это вызвало проблему, но после ее удаления логика ведет себя так, как ожидалось.