Как обрезать или приводить дату к дате в загрузке данных из csv в таблицу Oracle 11g - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно преобразовать входящее Datetime, отформатированное так, как это 2/5/2010 12:00:00 AM, и оно должно перейти в таблицу как "MM/DD/YYYY".Я исследовал и не могу найти, какой синтаксис использовать для приведения или усечения моего входящего Datetime.Я получаю эту ошибку

SQL*Loader-350: Syntax error at line 11.
Expecting "," or ")", found "(".
,   trunc(EXAMPLE_DATE)            DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE

, когда пытаюсь использовать этот код

OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE.TABLE
APPEND
FIELDS TERMINATED BY ','  optionally enclosed by '"'
TRAILING NULLCOLS
(
    EXAMPLE1                CHAR NULLIF (EXAMPLE1=BLANKS)
,   EXAMPLE2                CHAR NULLIF (EXAMPLE2=BLANKS)
,   trunc(EXAMPLE_DATE)     DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE=BLANKS)
)

Я пытался использовать to_date, trunc и to_char, но я не совсем уверен, какойиспользовать, и какой синтаксис его использовать. Очевидно, я не могу усечь EXAMPLE_DATE, как я пытаюсь.

РЕДАКТИРОВАТЬ: оригинальный код выглядит следующим образом

OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE.TABLE
APPEND
FIELDS TERMINATED BY ','  optionally enclosed by '"'
TRAILING NULLCOLS
(
    EXAMPLE1                CHAR NULLIF (EXAMPLE1=BLANKS)
,   EXAMPLE2                CHAR NULLIF (EXAMPLE2=BLANKS)
,   EXAMPLE_DATE        DATE "MM/DD/YYYY" NULLIF (EXAMPLE_DATE=BLANKS)
)

Этот код работаеткак и ожидалось, для файла csv только с датами в формате MM/DD/YYYY, но при задании Datetime, которое выглядит следующим образом: 2/5/2010 12:00:00 AM он выведет файл .bad в каталог csv.

1 Ответ

0 голосов
/ 28 февраля 2019

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

,   EXAMPLE_DATE        DATE "MM/DD/YYYY HH:MI:SS AM" NULLIF (EXAMPLE_DATE=BLANKS)

Я установил таблицу, соответствующую вашему примеру:

create table example_table (example1 varchar2(10), example2 varchar2(10), example_date date);

И файл данных, содержащий:

A,B,2/5/2010 12:00:00 AM

И управляющий файл, такой как:

OPTIONS (READSIZE=20971520, BINDSIZE=20971520, ROWS=10000, ERRORS=90000)
LOAD DATA
INFILE *
INTO TABLE EXAMPLE_TABLE
APPEND
FIELDS TERMINATED BY ','  optionally enclosed by '"'
TRAILING NULLCOLS
(
    EXAMPLE1                CHAR NULLIF (EXAMPLE1=BLANKS)
,   EXAMPLE2                CHAR NULLIF (EXAMPLE2=BLANKS)
,   EXAMPLE_DATE        DATE "MM/DD/YYYY HH:MI:SS AM" NULLIF (EXAMPLE_DATE=BLANKS)
)

Запуск этого через отчет:

Commit point reached - logical record count 1

и файл журнала сказал:

Table EXAMPLE_TABLE:
  1 Row successfully loaded.
  0 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.

и таблица заполнилась этими данными:

select * from example_table;

EXAMPLE1   EXAMPLE2   EXAMPLE_DA
---------- ---------- ----------
A          B          2010-02-05

Вы также сказали:

это должно войти втаблица как «ММ / ДД / ГГГГ»

Должна указываться в таблице как дата.Дата не имеет никакого внутреннего удобочитаемого формата;Oracle использует собственное внутреннее представление для эффективного и однозначного хранения данных.Когда вы запрашиваете таблицу, ваш клиент преобразует ее в распознаваемый формат для отображения, используя либо свои собственные настройки, либо настройку NLS_DATE_FORMAT вашего сеанса.Если вы видите даты в формате, который вы показали, то это то, что ваш клиент / сессия настроен для их отображения.Мой настроен как YYYY-MM-DD, так что вы видите это в выводе моего запроса выше.

...