При использовании SQLLDR не удалось передать дату «ГГГГММДД» из CVS в базу данных Oracle. - PullRequest
1 голос
/ 24 октября 2019

Привет, я новичок в использовании sqlldr. Я пытаюсь отправить данные из CSV-файла в БД.

CSV-файл выглядит следующим образом employee.dat:

id,code,dNum,name,last,StartDate,EndDate
MA2001,gg,0011,John,Smith,20020127,20020127

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

OPTIONS(skip=1,bindsize=20000000,readsize=20000000,rows=1024)
LOAD DATA
APPEND
INTO TABLE SOMETHING_ADMIN.EMPLOYEE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
  "id"
  ,"code"
  ,"dNum"    FLOAT            
  ,"name"
  ,"last"
  ,"StartDate"   DATE "YYYYMMDD"
  ,"EndDate"  DATE "YYYYMMDD"
)

При выполнении загрузки я получаю следующую ошибку:

Record 1: Rejected - Error on table Record 1: Rejected - Error on table SOMETHING_ADMIN.EMPLOYEE, column "StartDate".
ORA-01841: (full) year must be between -4713 and +9999, and not be 0

Определение таблицы:

CREATE TABLE "EMPLOYEE" (
  "id" VARCHAR2(30 BYTE),
  "code" VARCHAR2(10 BYTE),
  "dNum" NUMBER(8,0),
  "name" VARCHAR2(20 BYTE),
  "last" VARCHAR2(20 BYTE),
  "StartDate" DATE,
  "EndDate" DATE,
);

Что я делаю неправильно? Я знаю, это кажется простым вопросом, но я просто не могу понять.

спасибо

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Если вы воссоздаете таблицу (о, да - пожалуйста, избегайте заключать что-нибудь в двойные кавычки в Oracle; никогда не везет), чтобы столбцы «дата» были VARCHAR2 (почему? Чтобы убедиться, что они будут загружены (для целей отладки) и загружены данные, вот что вы получите:

ID     CODE             DNUM NAME    LAST    STARTDATE  ENDDATE
------ ---------- ---------- ------- ------- ---------- ----------
ma2001 gg                  0         john    smith      20020127

См. DNUM и NAME столбцы? Все смещено вправо, поэтому значение даты, которое должно было храниться в столбце STARTDATE, теперь находится в ENDDATE, а значение enddate равно lost .


Вернуться к исходной таблице:

SQL> desc employee
 Name                                      Null?    Type
 ----------------------------------------- -------- --------------
 ID                                                 VARCHAR2(30)
 CODE                                               VARCHAR2(10)
 DNUM                                               NUMBER(8)
 NAME                                               VARCHAR2(20)
 LAST                                               VARCHAR2(20)
 STARTDATE                                          DATE
 ENDDATE                                            DATE

SQL>

Контрольный файл;единственная «спецификация» оставлена ​​в формате даты, т.е. удалить FLOAT (зачем вы вообще ее использовали?):

OPTIONS(skip=1)
LOAD DATA
infile *
truncate
INTO TABLE EMPLOYEE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
  id
  ,code
  ,dNum     
  ,name
  ,last
  ,StartDate date 'yyyymmdd'
  ,EndDate   date 'yyyymmdd'
)

begindata
id,code,dnum,name,last,startdate,enddate
ma2001,gg,0011,john,smith,20020127,20020127

Загрузка сеанса и результат:

SQL> $sqlldr scott/tiger control=test11.ctl log=test11.log

SQL*Loader: Release 11.2.0.2.0 - Production on ╚et Lis 24 22:07:47 2019

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 1

SQL> select * From employee;

ID     CODE             DNUM NAME    LAST    STARTDATE  ENDDATE
------ ---------- ---------- ------- ------- ---------- ----------
ma2001 gg                 11 john    smith   27.01.02   27.01.02
2 голосов
/ 24 октября 2019

Синтаксический анализатор Oracle иногда довольно глуп с ошибками, которые он возвращает. Я не думаю, что ему понравилось ключевое слово FLOAT. Убрал это и ненужные кавычки, и, кажется, работает для меня.

OPTIONS(skip=1,bindsize=20000000,readsize=20000000,rows=1024)
LOAD DATA
infile 'test.csv'
APPEND
INTO TABLE EMPLOYEE
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
  id 
  ,code 
  ,dNum       
  ,name    
  ,last    
  ,StartDate   DATE 'YYYYMMDD'
  ,EndDate   DATE 'YYYYMMDD'  
  )
...