1.sqlldr的用法
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:
- A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中
- 建立数据库间的 dblink,然后用 create table B as select from A@dblink where ...,或 insert into B select from A@dblink where ...
- exp A 表,再 imp 到 B 表,exp 时可加查询条件
- 程序实现 select from A ..,然后 insert into B ...,也要分批提交
- 再就是本篇要说到的 Sql Loader(sqlldr) 来导入数据,效果比起逐条 insert 来很明显
下面主要介绍Sql Loader(sqlldr) 来导入数据。
在命令行下执行 Oracle 的 sqlldr 命令,可以看到它的详细参数说明,要着重关注以下几个参数:
userid -- Oracle 的 username/password[@servicename]
control -- 控制文件,可能包含表的数据
log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log
bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad
data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作
errors -- 允许的错误记录数,可以用他来控制一条记录都不能错
rows -- 多少条记录提交一次,默认为 64
skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述
首先:建立一个控制文件 data.ctl,内容如下:
load data
CHARACTERSET UTF8
infile "/data/all_zc_pro/tmp01/data01.txt" --指定外部数据文件
append --操作类型,在表中追加新记录
into table TEMP_LH_FDD_USER -- 要插入记录的表
fields terminated by '|' --数据分隔的方式,“|”
trailing nullcols --表的字段没有对应的值时允 许为空
( --对应的字段
PROV_ID,
DEVICE_NUMBER,
IMEI,
FLUX,
FLUX_4G,
FLUX_TDD
)
说 明:在操作类型 append 位置可用以下中的一值:
1) insert --为缺省方式,在数据装载开始时要求表为空
2)truncate --用 truncate table 来清除表中原有 记录
3) replace --删除旧记录(用 delete from table 语句),替换成新装载的记录
4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录
执行语句:
sqlldr userid=ZBG_D/ZBG_DA02@DSSDE control=/data/all_zc_pro/data.ctl log=/data/all_zc_pro/zc/zc_dwa/log20161020.log bad=/data/all_zc_pro/zc/zc_dwa/bad20161020.log
如果数据量很大,可以再加两个参数:direct=ture rows=10000000 rows参数是一次加载的行数
2.sqluldr的用法
Oracle数据导出工具sqluldr可以将数据以csv、txt等文件格式导出,适用于大批量数据的导出,导出速度非常快,导出后可以使用Oracle SQL Loader工具将数据导入到数据库中。
执行语句:
sqluldr USER=ZBG_D/ZBG_D0812@DSSDWE query="SELECT DEVICE_NUMBER,IMSI FROM ZBG_DWA.DWA_V_D_CUS_NM_USER_IMSI_011 " rows=100000 field="0x7C" safe="yes" file=/data/all_zc_pro/zc/zc_dwa/ks_imsi_device.txt;
Field 分隔符 指定字段分隔符,默认为逗号
在指定分隔符时,可以用字符的ASCII代码(0xXX,大写的XX为16进制的ASCII码值)来指定一个字符,常用的字符的ASCII代码如下:
回车=0x0d,换行=0x0a,TAB键=0x09,|=0x7c,&=0x26,双引号=0x22,单引号=0x27