Oracle 使用SQLLDR加载CSV(已拒绝)
我有CSV文件。我想用SQLLDR将csv文件的内容加载到oracle数据库。 我的SQLLDR是Oracle 使用SQLLDR加载CSV(已拒绝),oracle,csv,load,sql-loader,ctl,Oracle,Csv,Load,Sql Loader,Ctl,我有CSV文件。我想用SQLLDR将csv文件的内容加载到oracle数据库。 我的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 My loader.ctl是 OPTIONS (SKIP=1) LOAD DATA APPEND
@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
My 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,
)
My 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行有四列
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
这实际上应该是一个单独的问题,但要加载固定值,您可以将列设置为具有默认值,并且根本不在控制文件中指定它,或者如果您有时想要覆盖它,可以选择使用DEFAULTIF
子句;或者更简单地使用SQL字符串来获取值。修改表定义以包含load\u date
字段(并将第一列名称从number
更改为id
,它不是保留字,并将其键入number
):
那么控制文件是:
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
以及:
您需要这样做,以便双引号之间的逗号仅被视为值的一部分,而不是分隔符
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
这实际上应该是一个单独的问题,但要加载固定值,您可以将列设置为具有默认值,并且根本不在控制文件中指定它,或者如果您有时想要覆盖它,可以选择使用DEFAULTIF
子句;或者更简单地使用SQL字符串来获取值。修改表定义以包含load\u date
字段(并将第一列名称从number
更改为id
,它不是保留字,并将其键入number
):
那么控制文件是:
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
以及:
我是否可以将control.ctl编辑为(id“TRIM(:id)”、load_date“SYSDATE”、name“TRIM(:name)”、total“TRIM(:total)”、)@flyingbird013-您需要在数据文件中找到一个匹配字段,why(如果不是空的话)的内容将被忽略。如果您还没有这样一个字段,就更容易保持原样。控制文件中的字段顺序不必与表中的顺序相匹配,如果您担心的话。(修剪数字字段可能也没什么意义,不是吗?)我可以将control.ctl编辑为(id“TRIM(:id)”,加载日期为“SYSDATE”,名称为“TRIM(:name)”,总计为“TRIM(:total)”,@flyingbird013-您需要在数据文件中有一个匹配的字段,why的内容(如果不是空的话)将被忽略。如果您还没有这样一个字段,就更容易保持原样。控制文件中的字段顺序不必与表中的顺序相匹配,如果您担心的话。(修剪数字字段可能也毫无意义,不是吗?)