使用 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
看到 DNUM
和 NAME
列了吗?一切都向右移动,所以日期值 - 应该存储在 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
您好,我刚开始使用 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
看到 DNUM
和 NAME
列了吗?一切都向右移动,所以日期值 - 应该存储在 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