使用 SQLLDR 的问题无法将日期 'YYYYMMDD' 从 CVS 传递到 oracle DB

Issue using SQLLDR unable to pass in date 'YYYYMMDD' from CVS to oracle DB

您好,我刚开始使用 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

Table定义:

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,
);

我做错了什么?我知道这似乎是一个简单的问题,但我就是想不通。

谢谢

Oracle 解析器有时会因错误 returns 而变得非常愚蠢。我认为它不喜欢 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'  
  )

如果您重新创建 table(哦,是的 - 请避免将 任何东西 括在 Oracle 中的双引号中;永远不会运气)这样 "date" 列是 VARCHAR2(为什么?这样我们就可以确保它们 被加载,用于调试目的)并加载数据,这就是你得到的:

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

看到 DNUMNAME 列了吗?一切都向右移动,所以日期值 - 应该存储在 STARTDATE 列中 - 现在在 ENDDATE 中,而 enddate 的值是 lost.


回到原来的table:

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>

控制文件;唯一的 "specification" 保留为日期格式,即删除 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