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

问题描述 投票:1回答:2

[嗨,我是使用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,
);

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

谢谢

sql oracle sqlplus sql-loader
2个回答
0
投票

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'  
  )

0
投票

如果您重新创建表(哦,是的,请避免在Oracle中将anything括在双引号中;永远不要碰运气),这样“ date”列为VARCHAR2(为什么?所以我们请确保将它们[[will出于调试目的而加载)并加载数据,这就是您得到的:

ID CODE DNUM NAME LAST STARTDATE ENDDATE ------ ---------- ---------- ------- ------- ---------- ---------- ma2001 gg 0 john smith 20020127
请参阅DNUMNAME列?一切都向右移动,因此日期值-本应存储在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

© www.soinside.com 2019 - 2024. All rights reserved.