我有CSV文件。我想将csv文件的内容加载到oracle database with SQLLDR.
我的SQLLDR
@echo off
sqlldr black@user/password data=D:\csv\data.csv control=D:\ctl\loader.ctl log=D:\ctl \loader.log bad=D:\ctl\loader.bad
pause
我的loader.ctl
OPTIONS (SKIP=1)
LOAD DATA
APPEND
INTO TABLE data2007
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
( number "TRIM (:number)",
name "TRIM (:name)",
total "TRIM (:total)",
)
表格
CREATE TABLE DATA2007 (
number VARCHAR2(6),
name VARCHAR2(30),
total NUMBER NULL,
)
我的data.csv:
Number,name,Total
1,"Marlyn",2000
2,"Bobby",1000
3,"Rina",2000
4,"Robby,Mr",5000
5,"juliet,Mrs",5000
行1,2,3 =成功,但第4行和第5行被拒绝。 我知道问题是第4行和第5行有四列。
答案 0 :(得分:4)
你需要delimit the field所以双引号之间的逗号只被视为值的一部分,而不是分隔符。
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
这应该是一个单独的问题,但是要加载固定值,您可以将列设置为具有默认值,而不是在控制文件中指定它,或者可选择使用DEFAULTIF
子句你有时可能想要覆盖它;或者更简单地使用SQL字符串来获取值。修改您的表格定义以包含load_date
字段(并将第一列名称从number
更改为id
,这不是保留字,并将其设置为NUMBER
) :
CREATE TABLE DATA2007 (
id NUMBER,
name VARCHAR2(30),
total NUMBER NULL,
load_date DATE
);
然后控制文件是:
OPTIONS (SKIP=1)
LOAD DATA
APPEND
INTO TABLE data2007
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
( id "TRIM (:id)",
name "TRIM (:name)",
total "TRIM (:total)",
load_date "SYSDATE"
)
使用原始数据文件运行它会产生:
Total logical records skipped: 1
Total logical records read: 5
Total logical records rejected: 0
Total logical records discarded: 0
和
SELECT * FROM data2007;
ID NAME TOTAL LOAD_DATE
---------- ------------------------------ ---------- -------------------
1 Marlyn 2000 2013-08-21 09:37:38
2 Bobby 1000 2013-08-21 09:37:38
3 Rina 2000 2013-08-21 09:37:38
4 Robby,Mr 5000 2013-08-21 09:37:38
5 juliet,Mrs 5000 2013-08-21 09:37:38
5 rows selected.