我有4个表,我使用sqldr从一个模式复制到另一个模式。其中3个表没有给我任何问题,我能够成功地将它们全部复制出来。第四是我的问题出现的地方。我无法理解为什么,就数据类型或其他任何内容而言,第4个表没有什么特别之处。当我运行sqlldr命令时,所有行都以.bad文件结尾,并且没有任何行被复制。我将列出使用的代码以便更好地理解。
> pico deptbb02.csv
UW PICO(tm) 4.10 File: deptbb02.csv
10,infield,Jade,Clairmont,Lets play two
20,outfield,House of Pasta,Santee,Alea iacta est
30,pitcher,Crab Shack,Pacific Beach,Semper paratus
40,staff,Burger King,Lakeside,Experientia docet
50,catchers,Pinnacle Peak,Santee,Non Bastardi Carborundum
UW PICO(tm) 4.10 File: deptload.ctl
LOAD DATA
infile 'deptbb02.csv'
replace into table deptbb02
fields terminated by ','
(DEPTNO,DNAME,RESTAURANT,LOCATION,MOTTO)
> sqlldr username/password@database
control = deptload.ctl
SQL*Loader: Release 10.2.0.1.0 - Production on Tue Jul 28 01:27:38 2015
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Commit point reached - logical record count 6
表deptbb02定义为......
SQL> desc deptbb02
Name Null? Type
----------------------------------------- -------- ----------------------------
DEPTNO NUMBER(3)
DNAME VARCHAR2(8)
RESTAURANT VARCHAR2(15)
LOCATION VARCHAR2(15)
MOTTO VARCHAR2(30)
我认为这应该是理解我的问题所需的一切,但不要犹豫,问我是否错过了什么。谢谢!
答案 0 :(得分:0)
我怀疑数据在MOTTO列的末尾有空格或控制字符,或者您发布的样本数据与尝试加载.log文件的数据不同。即
Record 3: Rejected - Error on table DEPTBB02, column MOTTO. ORA-12899: value too large for column "ST101"."DEPTBB02"."MOTTO" (actual: 44, maximum: 30)
MOTTO列在表中定义为varchar2(30),但sqlldr看到44个字符。第3条记录显示的数据为14个字符。在可以显示控制字符和空格的编辑器中打开数据文件。
尝试在控制文件中的字段周围调用TRIM()以删除前导和尾随空格:
LOAD DATA
infile 'deptbb02.csv'
replace into table deptbb02
fields terminated by ','
(DEPTNO,
DNAME,
RESTAURANT,
LOCATION,
MOTTO CHAR "TRIM(:MOTTO)"
)