我有一个问题。我有这个控制文件,当我从Windows客户端运行时工作正常。然而,当我直接在Linux中运行它时,它显示加载完成但是当我查看我的oracle数据时,没有数据,甚至还有不良记录。下面是我的控制文件在Windows中运行良好但在Linux中失败。 注意:如果我删除字符串或日期转换字段
,控制文件将起作用控制文件
load data
infile 'HOME/INPUT/FILEA.dat'
badfile 'HOME/BAD/FILEA.bad'
discardfile 'HOME/DIS/FILEA.dsc'
truncate
into table TEST
fields terminated by '|'
trailing nullcols
( ABCcode CHAR(11),
ABCID CHAR(6),
ABC_SEQNO "to_number(:ABC_SEQNO,'999999')",
PSNO "to_number(:PSNO,'99999999999.999')",
ABDF CHAR(1),
ABCFI CHAR(1),
ABC_DATE NULLIF ABC_DATE="00000000" "to_date(:ABC_DATE, 'YYYYMMDD')",
XZY_date NULLIF XZY_date="00000000" "to_date(:XZY_date, 'YYYYMMDD')",
DESC CHAR(1))
任何有关在Linux中运行此代码的帮助或想法都将受到赞赏
关于日志文件的注意事项:日志文件具有以下内容
ORA-00604:递归SQL级别1发生错误
ORA-12899:对于“ABCschema”列,值太大。“TEST”。“ABC_DATE”(实际:9,最大值:8)
此外,日期转换具有以下
如果ABC_DATE = 0X3030303030303030(字符'00000000'),则为NULL
列的SQL字符串:“to_date(:ABC_DATE,'YYYYMMDD')”
答案 0 :(得分:0)
您的TEST
表格将ABC_DATE
列定义为VARCHAR2(8)
,而不是DATE
。
如果我创建一个表:
create table test (
ABCcode VARCHAR2(11),
ABCID VARCHAR2(6),
ABC_SEQNO NUMBER,
PSNO NUMBER,
ABDF VARCHAR2(1),
ABCFI VARCHAR2(1),
ABC_DATE DATE,
XZY_date DATE,
"DESC" VARCHAR2(1)
);
并有一个数据文件:
A|B|1|2.3|C|D|20140217|20140218|E
然后加载很好。如果我重新创建表:
create table test (
ABCcode VARCHAR2(11),
ABCID VARCHAR2(6),
ABC_SEQNO NUMBER,
PSNO NUMBER,
ABDF VARCHAR2(1),
ABCFI VARCHAR2(1),
ABC_DATE VARCHAR2(8),
XZY_date DATE,
"DESC" VARCHAR2(1)
);
...然后相同的控制文件和数据文件现在给我:
Record 1: Rejected - Error on table TEST, column ABC_DATE.
ORA-12899: value too large for column "<schema>"."TEST"."ABC_DATE" (actual: 9, maximum: 8)
您正在将字符串值转换为日期,但是当您将数据实际插入VARCHAR2
列时,您正在将字符串隐式转换回字符串。当它这样做时,它使用的是NLS_DATE_FORMAT
设置,我得到的错误是将其设置为DD-MON-RR
。
你真的有三种选择。修改您的表格以包含实际的DATE
列;或者更改控制文件,使其只插入纯文本值,根本不进行日期转换;或按摩您的环境,以便转换回字符串获得您希望字符串的格式。
只有第一个才真正明智 - 如果是日期值,则始终将其存储为DATE
,而不是字符串。
0X30...
不是问题,只是显示它正在使用的内部表示。