简介
假如你需要把一个大小为10G左右带固定格式的txt数据文件导入到你指定的Oracle数据表中,你可以使用Oracle的sqlldr命令。
sqlldr命令
sqlldr是Oracle数据库提供的一个命令,所以如果要使用sqlldr命令,你得找一台成功安装Oracle数据库的电脑。然后输入sqlldr命令
sqlldr的简单使用命令如下:
sqlldr 用户名/密码@127.0.0.1:1521/DBName control=test_control.ctl log=/home/controlInfo.log
准备工作
1.首先需要自己编写test_contol.ctl文件。这个是控制文件,控制Oracle怎么处理数据。2.test_control.ctl文件长下面这个样子,你需要结合上面的txt数据文件的样子来理解并编写这个ctl文件。
test_control.ctl 文件语法解释
OPTIONS (skip=1,rows=128)这行可以不写可以直接写load data,skip跳过第一行数据,第一行数据一般是列头,rows128行提交一次load data 加载数据infile '/data/你要处理的数据文件data.txt'BADFILE '/data/坏数据文件_出错时ORACLE会自动创建.bad'DISCARDFILE '/data/ORACLE丢弃的数据.dis'append 表示往表里面追加数据,这里可以是insert(为缺省方式,在数据装载开始时要求表为空),append(在表中追加新记录)或者可以是replace(删除旧记录(用 delete from table 语句),替换成新装载的记录)或者可以是truncate (删除旧记录(用 truncate table 语句),替换成新装载的记录)into table "TABLE_NAME" 指定你自己的表名fields terminated by '|' 告诉ORACLE用什么分割数据trailing nullcols 表的字段没有对应的值时允 许为空 (列名3, 这里写你自己表的列名,注意这里的列名要跟你的数据文件里面的数据对应,数据文件里面第一列对应你表的哪一列列名2,列名1, "'Hi '||upper(:user_name)",还能用SQL函数或运算对数据进行加工处理列名4, "user_seq.nextval", --这一列直接取序列的下一值,而不用数据中提供的值 ,列名5,列名日期6 TIMESTAMP "YYYYMMDDHH24MISSff3" NULLIF (last_login="NULL"), 当字段为"NULL"时就是 NULL 列名日期7 TIMESTAMP "YYYYMMDDHH24MISSff3",列名主键 "SYS_GUID()")
还有一种情况就是:数据文件里面带双引号“”或者你数据文件第一列是没有意义的行号
你可以编写下面这种ctl文件处理:
OPTIONS (skip=1,rows=128)这行可以不写可以直接写load data,skip跳过第一行数据,第一行数据一般是列头,rows128行提交一次load data 加载数据infile '/data/你要处理的数据文件data.txt'BADFILE '/data/坏数据文件_出错时ORACLE会自动创建.bad'DISCARDFILE '/data/ORACLE丢弃的数据.dis'append 表示往表里面追加数据,这里可以是insert(为缺省方式,在数据装载开始时要求表为空),append(在表中追加新记录)或者可以是replace(删除旧记录(用 delete from table 语句),替换成新装载的记录)或者可以是truncate (删除旧记录(用 truncate table 语句),替换成新装载的记录)into table "TABLE_NAME" 指定你自己的表名fields terminated by ',' 告诉ORACLE用什么分割数据Optionally enclosed by '"' 这行也可以不写,数据文件中每列的数据用"框起为一个完整的数据,当字段中有 "," 分隔符时trailing nullcols 表的字段没有对应的值时允 许为空 (virtual_column FILLER, 这是一个虚拟字段,用来跳过第一列是没有意义的行号列名3, 这里写你自己表的列名,注意这里的列名要跟你的数据文件里面的数据对应,数据文件里面第一列对应你表的哪一列列名2,列名1, "'Hi '||upper(:user_name)",还能用SQL函数或运算对数据进行加工处理列名4, "user_seq.nextval", --这一列直接取序列的下一值,而不用数据中提供的值 ,列名5,列名日期6 TIMESTAMP "YYYYMMDDHH24MISSff3" NULLIF (last_login="NULL"), 当字段为"NULL"时就是 NULL 列名日期7 TIMESTAMP "YYYYMMDDHH24MISSff3",列名主键 "SYS_GUID()")