在 Oracle
数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:
1. A 表的记录导出为一条条分号隔开的 insert
语句,然后执行插入到 B 表中
2. 建立数据库间的 dblink,然后用 create table B as
select * from
A@dblink where
...,或 insert into B select * from
A@dblink where ...
3. exp A 表,再 imp 到 B 表,exp 时可加查询条件
4. 程序实现 select from A ..,然后 insert into B
...,也要分批提交
5. 再就是本篇要说到的 Sql Loader(sqlldr)
来导入数据,效果比起逐条 insert 来很明显
第 1
种方法在记录多时是个噩梦,需三五百条的分批提交,否则客户端会死掉,而且导入过程很慢。如果要不产生
REDO 来提高 insert into
的性能,就要下面那样做:
- alter table B nologging;
-
insert into B(c1,c2)
values(x,xx);
-
insert into B
select * from
A@dblink where
.....;
alter table B nologging;insert into B(c1,c2) values(x,xx);insert
into B select * from A@dblink where .....;
好啦,前面简述了 Oracle
中数据导入导出的各种方法,我想一定还有更高明的。下面重点讲讲
Oracle 的 Sql Loader (sqlldr) 的用法。
在命令行下执行 Oracle
的 sqlldr
命令,可以看到它的详细参数说明,要着重关注以下几个参数:
userid -- Oracle 的
username/password[@servicename]
control --
控制文件,可能包含表的数据
------------------------------------------------------------------------------------------------------------------
log -- 记录导入时的日志文件,默认为
控制文件(去除扩展名).log
bad -- 坏数据文件,默认为
控制文件(去除扩展名).bad
data -- 数据文件,一般在控制文件中指定
errors --
允许的错误记录数,可以用他来控制一条记录都不能错
rows -- 多少条记录提交一次,默认为 64
skip --
跳过的行数,比如导出的数据文件前面几行是表头或其他描述
还有更多的 sqlldr 的参数说明请参考:
sql loader的用法。
用例子来演示 sqlldr
的使用,有两种使用方法:
1.
只使用一个控制文件,在这个控制文件中包含数据
2. 使用一个控制文件(作为模板)
和一个数据文件
一般为了利于模板和数据的分离,以及程序的不同分工会使用第二种方式,所以先来看这种用法。数据文件可以是
CSV 文件或者以其他分割符分隔的,数据文件可以用
PL/SQL Developer 或者 Toad 导出,也可以
用 SQL *Plus 的 spool 格式化产出,或是
UTL_FILE 包生成。另外,用 Toad
还能直接生成包含数据的控制文件。
首先,假定有这么一个表
users,并插入五条记录:
- create table users(
-
user_id number,
-
user_name varchar2(50),
-
login_times number,
-
last_login
date)
create table users( user_id number, user_name varchar2(50),
login_times number, last_login date) |
- insert into users
values(1,'Unmi',3,sysdate);
-
insert into users
values(2,NULL,5,to_date('2008-10-15','YYYY-MM-DD'));
-
insert into users
values(3,'隔叶黄莺',8,to_date('2009-01-02','YYYY-MM-DD'));
-
insert into users
values(4,'Kypfos',NULL,NULL);
-
insert into users
values(5,'不知秋',1,to_date('2008-12-23','YYYY-MM-DD'));
insert into users values(1,'Unmi',3,sysdate); insert into users
values(2,NULL,5,to_date('2008-10-15','YYYY-MM-DD')); insert into
users
values(3,'隔叶黄莺',8,to_date('2009-01-02','YYYY-MM-DD'));
insert into users values(4,'Kypfos',NULL,NULL); insert into users
values(5,'不知秋',1,to_date('2008-12-23','YYYY-MM-DD')); |
第二种方式: 使用一个控制文件(作为模板)
和一个数据文件
1) 建立数据文件,我们这里用 PL/SQL Developer 导出表
users 的记录为 users_data.csv 文件,内容如下:
-
"
","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN"
-
"1","1","Unmi","3","2009-1-5
20:34:44"
-
"2","2","","5","2008-10-15"
-
"3","3","隔叶黄莺","8","2009-1-2"
-
"4","4","Kypfos","",""
-
"5","5","不知秋","1","2008-12-23"
"
","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN""1","1","Unmi","3","2009-1-5
20:34:44""2","2","","5","2008-10-15""3","3","隔叶黄莺","8","2009-1-2""4","4","Kypfos","","""5","5","不知秋","1","2008-12-23"
2) 建立一个控制文件 users.ctl,内容如下:
- OPTIONS
(skip=1,rows=128) -- sqlldr
命令显示的选项可以写到这里边来
-
LOAD DATA
-
INFILE
"users_data.csv"
-
truncate
-
INTO TABLE users
-
Fields terminated by
","
-
Optionally enclosed by
'"'
- trailing nullcols
- (
- virtual_column
FILLER, --跳过由 PL/SQL Developer
生成的第一列序号
-
user_id,
-
user_name,
-
login_times,
- last_login
DATE "YYYY-MM-DD HH24:MI:SS" NULLIF
(last_login="")
- )
OPTIONS (skip=1,rows=128) -- sqlldr
命令显示的选项可以写到这里边来LOAD DATAINFILE
"users_data.csv"truncateINTO TABLE usersFields terminated by
","Optionally enclosed by '"'trailing nullcols(virtual_column
FILLER, --跳过由 PL/SQL Developer
生成的第一列序号user_id,user_name,login_times,last_login
DATE "YYYY-MM-DD HH24:MI:SS" NULLIF (last_login=""))
3) 执行命令:
sqlldr
dbuser/dbpass@dbservice
control=users.ctl
在 dbservice 指示的数据库的表 users
中记录就和数据文件中的一样了。
第一种方式,只使用一个控制文件在这个控制文件中包含数据
1) 把 users_data.cvs 中的内容补到 users.ctl 中,并以
BEGINDATA 连接,还要把 INFILE "users_data.csv" 改为 INFILE
*。此时,完整的 users.ctl 文件内容是:
- OPTIONS
(skip=1,rows=128) -- sqlldr
命令显示的选项可以写到这里边来
-
LOAD DATA
- INFILE *
-
truncate
-
INTO TABLE users
-
Fields terminated by
","
-
Optionally enclosed by
'"'
- trailing nullcols
- (
- virtual_column
FILLER, --跳过由 PL/SQL Developer
生成的第一列序号
-
user_id,
-
user_name,
-
login_times,
- last_login
DATE "YYYY-MM-DD HH24:MI:SS" NULLIF
(last_login="")
- )
- BEGINDATA
-
" ","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN"
-
"1","1","Unmi","3","2009-1-5
20:34:44"
-
"2","2","","5","2008-10-15"
-
"3","3","隔叶黄莺","8","2009-1-2"
-
"4","4","Kypfos","",""
-
"5","5","不知秋","1","2008-12-23"
OPTIONS (skip=1,rows=128) -- sqlldr
命令显示的选项可以写到这里边来LOAD DATAINFILE
*truncateINTO TABLE usersFields terminated by ","Optionally
enclosed by '"'trailing nullcols(virtual_column FILLER, --跳过由
PL/SQL Developer
生成的第一列序号user_id,user_name,login_times,last_login
DATE "YYYY-MM-DD HH24:MI:SS" NULLIF (last_login=""))BEGINDATA"
","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN""1","1","Unmi","3","2009-1-5
20:34:44""2","2","","5","2008-10-15""3","3","隔叶黄莺","8","2009-1-2""4","4","Kypfos","","""5","5","不知秋","1","2008-12-23"
2) 执行一样的命令:
sqlldr
dbuser/dbpass@dbservice
control=users.ctl
未完,待续……
参考:1.
Oracle SQL*Loader
2.
sql loader的用法
3.
使用SQL
Loader导入大量数据,避免使用SQL频繁写库
4.
Oracle SQL Loader的详细语法
5.
oracle sql loader全攻略
6.
SQL*Loader Control File Reference
7.
学习oracle sql loader 的使用
8.
用sqlloader(sqlldr)装载LOB数据
相关推荐
NULL 博文链接:https://jxdwuao.iteye.com/blog/1704642
MySQL数据导入到Oracle的中间件,其工作原理是将MySQL数据的导出命令写入到d:/mysqltooracle/exportcmd.txt,打开该文件即可获取需要手动执行的导出MySQL数据的sql脚本,执行后会在 “/var/mysqltooracle”(针对...
Oracle数据库使用SQL_Loader导入外部数据的方法详解,详细讲解 sqlldr的使用
oracle sqlldr导入带有自动增加的数据实例
VS2013 C#.Net开发 C#利用SqlLdr 数据批量导入Oracle程序源码,高效可达万行/秒。 1.可多表同时执行 2.可视导入信息反馈,可查看错误数据及导入日志。 3.内含 批处理 执行方法 及 导入 ldr Demo文件。 4.内含导数据...
windowns下利用bat命令+oracle的sqlldr功能导入数据,导入速度很快
oracle sqlldr多文件批量导入
涂抹ORACLE-第5章-SQLLoader 加载数据之一千零一十一个怎么办
用的是11.2.0.4的Instant Client,Oracle没给sqlldr,Tools里面也没有(12C就有)。 网上下载了几个都是11.2.0.1的sqlldr,包括标了版本号的,都需要替换库文件。 这个是自己安装p13390677_112040_Linux-x86-64_4of7...
利用 sqluldr2导出数据 使用sqlldr导入数据 通过merge into 合并更新数据。
最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M http://download.csdn.net/download/mysky2008/4382509 下载了10g的,但本地测试出现sql*loader 704错误,不知道怎么...
Oracle sqlldr 大批量数据导入工具使用实例,通过Oracle 自带的sqlldr 工具可快速导入大批量的数据至Oracle中。 工具使用前提条件: 1.安装的Oracle Client 不能为精简版,要不然就找不到sqlldr.exe 2.将Oracle的...
利用sqlldr大量数据导入,方便,快速
oracle11g基本客户端,主要是sqlplus,sqlldr,exp,imp这几个命令。最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M ...
oracle sqlloader 使用指南 数据装载
Import采用直接路径方式,等同于sqlldr的Direct方式导入(DIRECT=TRUE),nolog参数等同于sqldr的UNRECOVERABLE参数 ozoradts -exp userid=test/test@oradb columnover=";" query="select * from fct_serv_product_...
使用SQLLDR导入数据 相关实际操作请参考我的博文 http://blog.csdn.net/ben0133/archive/2011/04/04/6301284.aspx
最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M http://download.csdn.net/download/mysky2008/4382509 下载了10g的,但本地测试出现sql*loader 704错误,不知道怎么...
C# 通过oracle sqlldr 将TXT批量导入oracle 一个文件夹里有大量的TXT文件,以"~"区分各字段. 这个程序能批量将此文件夹里的所有的文件导入oralce 并按日期把已导入的TXT文件复制另一个文件夹
oracle11g基本客户端,主要是sqlplus,sqlldr,exp,imp这几个命令。最最主要的还是sqlldr,想找个单独可用的sqlldr,在Oracle 10g Client 精简优化安装包不到12M ...