由于业务需要,通过开发编写了一个txt文件内容提取器,将txt内容提取后获得了一个50多w行数据的csv文件,无法使用PLSQL的文件导入器(sqlldr)功能,经查询,采用自己编写sqlldr程序进行导入。ctl文件如下:
options (skip=1,rows=1000)
load data
CHARACTERSET ZHS16GBK
INFILE 'E:\lms.csv'
INTO TABLE "TXT_DR"
truncate
Fields terminated by ","
trailing nullcols
(JDLJ,WJM,
NR1 char(1000000))
命令窗口执行语句:sqlldr userid=C##ZZK/123456@127.0.0.1/orcl readsize=10485760 control=C:\Users\lenovo\Desktop\DR.ctl log=E:\22.log ;
遇到的问题:
1.导入表txt_dr 的nr1字段是clob格式,需要添加字符格式char(100000)字符长度够你用就行。不添加字符格式,会默认为VARCHAR(255)/CHAR(255),无法导入超4000字符的哪行数据。
2.
SQL*Loader错误处理
错误报告:
SQL*Loader-510: 数据文件 (test.dmp) 中物理记录超过最大限制 (1048576)
SQL*Loader-2026: 加载因 SQL 加载程序无法继续而被终止。
处理方法:
修改 readsize — 读取缓冲区的大小 (默认 1048576)
添加readsize 参数,手动限制大小,大小必须为1048576的整数倍
sqlldr的 语法,参数参考如下:
--关闭归档日志,提高导入速度(仅直接路径时有效)
--unrecoverable
load data
--指定编码
characterset 'UTF8'
--1.指定要加载的数据文件
--INFILE 和INDDN是同义词,它们后面都是要加载的数据文件。如果用 * 则表示数据就在控制文件内。
[ { INFILE | INDDN } {file | * } ]
--BADFILE和BADDN是同义词。file指定坏数据保存的文件
[{ BADFILE | BADDN } file ]
--DISCARDFILE和DISCARDDN是同义词。file指定丢弃的数据文件
[{ DISCARDFILE | DISCARDDN } file ]
--2.指定操作类型
--insert:默认值,装载空表,如果原先的表有数据,sqlloader会停止
--append:原先的表有数据 就在表中追加新记录
--replace:删除旧记录(用 delete from table 语句),替换成新装载的记录
--truncate:删除旧记录(用 truncate table 语句),替换成新装载的记录
[ APPEND | REPLACE | INSERT | TRUNCATE ]
--3.指定操作的表
INTO TABLE [user.]table
--4.指定过滤条件
--[when id = id_memo]
--5.指定字段分隔符
--字段分隔符
fields terminated by ','
--字段用什么字符包括起来
optionally enclosed by '"'
--字段没有对应的值时允许为空
trailing nullcols
--6.指定表字段
--常见数据类型
--CHAR 字符
--DATE 日期
--INTEGER 整数
--FLOAT 普通符点
--DOUBLE 双精度符点
id,--类型未指定时,默认为character,每个字段的实际解析类型见log文件
code integer,
name char(1000),
sum double,
create_date date "yyyy-mm-dd hh24:mi:ss",