在UNIX中运行sqlldr控制文件

时间:2014-02-18 17:45:41

标签: oracle sql-loader

我有一个问题。我有这个控制文件,当我从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')”

1 个答案:

答案 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...不是问题,只是显示它正在使用的内部表示。