sqlldr的用法
<span class="Apple-style-span" style="font-size: 13px; line-height: 18px; font-family: Verdana;"><p style="margin: 10px 0px;">在 Oracle数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:<br><br>1. A 表的记录导出为一条条分号隔开的 insert
语句,然后执行插入到 B 表中<br>2. 建立数据库间的 dblink,然后用 create table B as select *
from <a style="color: navy; text-decoration: none;" href="mailto:A@dblink">A@dblink</a> where ...,或 insert into B select *
from <a style="color: navy; text-decoration: none;" href="mailto:A@dblink">A@dblink</a> where ...<br>3. exp A 表,再 imp 到 B
表,exp 时可加查询条件<br>4. 程序实现 select from A ..,然后 insert into B ...,也要分批提交<br>5.
再就是本篇要说到的 Sql Loader(sqlldr) 来导入数据,效果比起逐条 insert 来很明显<br><br>第 1
种方法在记录多时是个噩梦,需三五百条的分批提交,否则客户端会死掉,而且导入过程很慢。如果要不产生 REDO 来提高 insert into
的性能,就要下面那样做:<br><br></p>
<div class="dp-highlighter" style="border: 1px solid rgb(209, 215, 220); overflow: auto; font-size: 12px; margin: 0px; width: 99%; font-family: 'Courier New',Courier,mono; background-color: rgb(250, 250, 250);">
<ol class="dp-sql" style="padding: 2px; margin: 0px 0px 1px 38px; color: rgb(43, 145, 175);"><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">alter</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">table</span><span style="color: black; line-height: 120%;"> B nologging; </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">insert</span><span style="color: black; line-height: 120%;"> /* +APPEND */ </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">into</span><span style="color: black; line-height: 120%;"> B(c1,c2) </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">values</span><span style="color: black; line-height: 120%;">(x,xx); </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">insert</span><span style="color: black; line-height: 120%;"> /* +APPEND */ </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">into</span><span style="color: black; line-height: 120%;"> B </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">select</span><span style="color: black; line-height: 120%;"> * </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">from</span><span style="color: black; line-height: 120%;"> A@dblink </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">where</span><span style="color: black; line-height: 120%;"> .....; </span></span></li></ol></div><br>好
啦,前面简述了 Oracle 中数据导入导出的各种方法,我想一定还有更高明的。下面重点讲讲 Oracle 的 Sql Loader
(sqlldr) 的用法。<br><br>在命令行下执行 Oracle 的 sqlldr
命令,可以看到它的详细参数说明,要着重关注以下几个参数:<br><br><font color="#ff0000">userid</font> --
Oracle 的 username/password[@servicename]<br><font color="#ff0000">control</font> --
控制文件,可能包含表的数据<br>-------------------------------------------------------------------------------------------------------<br>log
-- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log<br>bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad<br>data
-- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作<br>errors --
允许的错误记录数,可以用他来控制一条记录都不能错<br>rows -- 多少条记录提交一次,默认为 64<br>skip --
跳过的行数,比如导出的数据文件前面几行是表头或其他描述<br><br>还有更多的 sqlldr 的参数说明请参考:<a style="color: navy; text-decoration: none;" href="http://www.myfaq.com.cn/2005September/2005-09-13/206612.html" target="_blank">sql loader的用法</a>。<br><br>用例子来演示 sqlldr 的使用,有两种使用方法:<br><br>1.
只使用一个控制文件,在这个控制文件中包含数据<br>2. 使用一个控制文件(作为模板) 和一个数据文件<br><br>一般为了利于模板和数据的
分离,以及程序的不同分工会使用第二种方式,所以先来看这种用法。数据文件可以是 CSV 文件或者以其他分割符分隔的,数据文件可以用 PL/SQL
Developer 或者 Toad 导出,也可以<a title="这个连接里有介绍 SQL *Plus 和 UTL_FILE 生成数据文件" style="color: navy; text-decoration: none;" href="http://soft.ccw.com.cn/programing/database/htm2008/20080925_509432_2.shtml" target="_blank">用 SQL *Plus 的 spool 格式化产出,或是 UTL_FILE 包生成</a>。另外,用
Toad 还能直接生成包含数据的控制文件。<br><br>首先,假定有这么一个表 users,并插入五条记录:<br><br>
<div class="dp-highlighter" style="border: 1px solid rgb(209, 215, 220); overflow: auto; font-size: 12px; margin: 0px; width: 99%; font-family: 'Courier New',Courier,mono; background-color: rgb(250, 250, 250);">
<ol class="dp-sql" style="padding: 2px; margin: 0px 0px 1px 38px; color: rgb(43, 145, 175);"><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">create</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">table</span><span style="color: black; line-height: 120%;"> users( </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"> user_id number, <span class="comment" style="color: green; line-height: 120%;">--用户 ID</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"> user_name varchar2(50), <span class="comment" style="color: green; line-height: 120%;">--用户名</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"> login_times number, <span class="comment" style="color: green; line-height: 120%;">--登陆次数</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"> last_login <span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">date</span><span style="color: black; line-height: 120%;"> </span><span class="comment" style="color: green; line-height: 120%;">--最后登录日期</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">) </span></li></ol></div><br>
<div class="dp-highlighter" style="border: 1px solid rgb(209, 215, 220); overflow: auto; font-size: 12px; margin: 0px; width: 99%; font-family: 'Courier New',Courier,mono; background-color: rgb(250, 250, 250);">
<ol class="dp-sql" style="padding: 2px; margin: 0px 0px 1px 38px; color: rgb(43, 145, 175);"><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">insert</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">into</span><span style="color: black; line-height: 120%;"> users </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">values</span><span style="color: black; line-height: 120%;">(1,'Unmi',3,sysdate); </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">insert</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">into</span><span style="color: black; line-height: 120%;"> users </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">values</span><span style="color: black; line-height: 120%;">(2,</span><span class="op" style="color: blue; line-height: 120%;">NULL</span><span style="color: black; line-height: 120%;">,5,to_date('2008-10-15','YYYY-MM-DD')); </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">insert</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">into</span><span style="color: black; line-height: 120%;"> users </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">values</span><span style="color: black; line-height: 120%;">(3,'隔叶黄莺
',8,to_date('2009-01-02','YYYY-MM-DD')); </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">insert</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">into</span><span style="color: black; line-height: 120%;"> users </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">values</span><span style="color: black; line-height: 120%;">(4,'Kypfos',</span><span class="op" style="color: blue; line-height: 120%;">NULL</span><span style="color: black; line-height: 120%;">,</span><span class="op" style="color: blue; line-height: 120%;">NULL</span><span style="color: black; line-height: 120%;">); </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">insert</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">into</span><span style="color: black; line-height: 120%;"> users </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">values</span><span style="color: black; line-height: 120%;">(5,'不知秋
',1,to_date('2008-12-23','YYYY-MM-DD')); </span></span></li></ol></div><br>第
二种方式: 使用一个控制文件(作为模板) 和一个数据文件<br><br>1) 建立数据文件,我们这里用 PL/SQL Developer 导出表
users 的记录为 users_data.csv 文件,内容如下:<br><br>
<div class="dp-highlighter" style="border: 1px solid rgb(209, 215, 220); overflow: auto; font-size: 12px; margin: 0px; width: 99%; font-family: 'Courier New',Courier,mono; background-color: rgb(250, 250, 250);">
<ol class="dp-sql" style="padding: 2px; margin: 0px 0px 1px 38px; color: rgb(43, 145, 175);"><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="string" style="color: red; line-height: 120%;">" "</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"USER_ID"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"USER_NAME"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"LOGIN_TIMES"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"LAST_LOGIN"</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="string" style="color: red; line-height: 120%;">"1"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"1"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"Unmi"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"3"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"2009-1-5 20:34:44"</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="string" style="color: red; line-height: 120%;">"2"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"2"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">""</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"5"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"2008-10-15"</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="string" style="color: red; line-height: 120%;">"3"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"3"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"隔叶黄莺"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"8"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"2009-1-2"</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="string" style="color: red; line-height: 120%;">"4"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"4"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"Kypfos"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">""</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">""</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="string" style="color: red; line-height: 120%;">"5"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"5"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"不知秋"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"1"</span><span style="color: black; line-height: 120%;">,</span><span class="string" style="color: red; line-height: 120%;">"2008-12-23"</span><span style="color: black; line-height: 120%;"> </span></span></li></ol></div><br>2)
建立一个控制文件 users.ctl,内容如下:<br><br>
<div class="dp-highlighter" style="border: 1px solid rgb(209, 215, 220); overflow: auto; font-size: 12px; margin: 0px; width: 99%; font-family: 'Courier New',Courier,mono; background-color: rgb(250, 250, 250);">
<ol class="dp-sql" style="padding: 2px; margin: 0px 0px 1px 38px; color: rgb(43, 145, 175);"><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span style="color: black; line-height: 120%;">OPTIONS (skip=1,</span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">rows</span><span style="color: black; line-height: 120%;">=128) </span><span class="comment" style="color: green; line-height: 120%;">-- sqlldr 命令显示的
选项可以写到这里边来,skip=1 用来跳过数据中的第一行</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">LOAD</span><span style="color: black; line-height: 120%;"> DATA </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">INFILE <span class="string" style="color: red; line-height: 120%;">"users_data.csv"</span><span style="color: black; line-height: 120%;"> </span><span class="comment" style="color: green; line-height: 120%;">--指定外部数据文件,可以写多
个 INFILE "another_data_file.csv" 指定多个数据文件</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="comment" style="color: green; line-height: 120%;">--这里还可以使
用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件,</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">truncate</span><span style="color: black; line-height: 120%;"> </span><span class="comment" style="color: green; line-height: 120%;">--操作类型,用 truncate table 来清除表中原有
记录</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">INTO</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">TABLE</span><span style="color: black; line-height: 120%;"> users </span><span class="comment" style="color: green; line-height: 120%;">-- 要插入记录的表</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">Fields terminated <span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">by</span><span style="color: black; line-height: 120%;"> </span><span class="string" style="color: red; line-height: 120%;">","</span><span style="color: black; line-height: 120%;"> </span><span class="comment" style="color: green; line-height: 120%;">-- 数据中每行记录用 "," 分隔</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">Optionally enclosed <span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">by</span><span style="color: black; line-height: 120%;"> '</span><span class="string" style="color: red; line-height: 120%;">"' -- 数据中每个字段用 '"</span><span style="color: black; line-height: 120%;">' 框起,比如字段中有 </span><span class="string" style="color: red; line-height: 120%;">","</span><span style="color: black; line-height: 120%;"> 分隔符时 </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">trailing nullcols <span class="comment" style="color: green; line-height: 120%;">--表的字段没有对应的值时允
许为空</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">( </span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"> virtual_column FILLER, <span class="comment" style="color: green; line-height: 120%;">--这是一个虚拟字段,用来跳
过由 PL/SQL Developer 生成的第一列序号</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"> user_id number, <span class="comment" style="color: green; line-height: 120%;">--字段可以指定类型,否则认
为是 CHARACTER 类型, log 文件中有显示</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"> user_name, </span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"> login_times, </span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"> last_login <span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">DATE</span><span style="color: black; line-height: 120%;"> </span><span class="string" style="color: red; line-height: 120%;">"YYYY-MM-DD HH24:MI:SS"</span><span style="color: black; line-height: 120%;"> </span><span class="comment" style="color: green; line-height: 120%;">-- 指定接受日期的格式,相当用 to_date() 函数转换</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">) </span></li></ol></div><br>说
明:在操作类型 truncate 位置可用以下中的一值:<br><br>1) insert --为缺省方式,在数据装载开始时要求表为空<br>2)
append --在表中追加新记录<br>3) replace --删除旧记录(用 delete from table
语句),替换成新装载的记录<br>4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录<br><br>3)
执行命令:<br><br>sqlldr <a style="color: navy; text-decoration: none;" href="mailto:dbuser/dbpass@dbservice">dbuser/dbpass@dbservice</a> control=users.ctl<br><br>在
dbservice 指示的数据库的表 users 中记录就和数据文件中的一样了。<br><br>执行完 sqlldr
后希望能留意一下生成的几个文件,如 users.log 日志文件、users.bad 坏数据文件等。特别是要看看日志文件,从中可让你更好的理解
Sql Loader,里面有对控制文件的解析、列出每个字段的类型、加载记录的统计、出错原因等信息。<br><br>第一种方式,只使用一个控制文件
在这个控制文件中包含数据<br><br>1) 把 users_data.cvs 中的内容补到 users.ctl 中,并以 BEGINDATA
连接,还要把 INFILE "users_data.csv" 改为 INFILE *。同时为了更大化的说明问题,把数据处理了一下。此时,完整的
users.ctl 文件内容是:<br><br>
<div class="dp-highlighter" style="border: 1px solid rgb(209, 215, 220); overflow: auto; font-size: 12px; margin: 0px; width: 99%; font-family: 'Courier New',Courier,mono; background-color: rgb(250, 250, 250);">
<ol class="dp-sql" style="padding: 2px; margin: 0px 0px 1px 38px; color: rgb(43, 145, 175);"><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span style="color: black; line-height: 120%;">OPTIONS (skip=1,</span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">rows</span><span style="color: black; line-height: 120%;">=128) </span><span class="comment" style="color: green; line-height: 120%;">-- sqlldr 命令显示的
选项可以写到这里边来,skip=1 用来跳过数据中的第一行</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">LOAD</span><span style="color: black; line-height: 120%;"> DATA </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">INFILE * <span class="comment" style="color: green; line-height: 120%;">-- 因为数据同控制文件在一
起,所以用 * 表示</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">append <span class="comment" style="color: green; line-height: 120%;">-- 这里用
了 append 来操作,在表 users 中附加记录 </span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">INTO</span><span style="color: black; line-height: 120%;"> </span><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">TABLE</span><span style="color: black; line-height: 120%;"> users </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"><span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">when</span><span style="color: black; line-height: 120%;"> LOGIN_TIMES<>'8' </span><span class="comment" style="color: green; line-height: 120%;">-- 还可以用 when 子
句选择导入符合条件的记录</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">Fields terminated <span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">by</span><span style="color: black; line-height: 120%;"> </span><span class="string" style="color: red; line-height: 120%;">","</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">trailing nullcols </span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">( </span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"> virtual_column FILLER, <span class="comment" style="color: green; line-height: 120%;">--跳过
由 PL/SQL Developer 生成的第一列序号</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"> user_id <span class="string" style="color: red; line-height: 120%;">"user_seq.nextval"</span><span style="color: black; line-height: 120%;">, </span><span class="comment" style="color: green; line-height: 120%;">--这一列直接取序列的下一值,而不用数据中提供的值</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"> user_name <span class="string" style="color: red; line-height: 120%;">"'Hi '||upper(:user_name)"</span><span style="color: black; line-height: 120%;">,</span><span class="comment" style="color: green; line-height: 120%;">--,还能用SQL函数或运算对数据进行加工处理</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"> login_times terminated <span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">by</span><span style="color: black; line-height: 120%;"> </span><span class="string" style="color: red; line-height: 120%;">","</span><span style="color: black; line-height: 120%;">, </span><span class="func" style="color: rgb(255, 20, 147); line-height: 120%;">NULLIF</span><span style="color: black; line-height: 120%;">(login_times='</span><span class="op" style="color: blue; line-height: 120%;">NULL</span><span style="color: black; line-height: 120%;">') </span><span class="comment" style="color: green; line-height: 120%;">--可为列单独指定分隔符</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;"> last_login <span class="keyword" style="color: rgb(127, 0, 85); line-height: 120%;">DATE</span><span style="color: black; line-height: 120%;"> </span><span class="string" style="color: red; line-height: 120%;">"YYYY-MM-DD HH24:MI:SS"</span><span style="color: black; line-height: 120%;"> </span><span class="func" style="color: rgb(255, 20, 147); line-height: 120%;">NULLIF</span><span style="color: black; line-height: 120%;"> (last_login=</span><span class="string" style="color: red; line-height: 120%;">"NULL"</span><span style="color: black; line-height: 120%;">) </span><span class="comment" style="color: green; line-height: 120%;">-- 当字段为"NULL"时就是 NULL</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">) </span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">BEGINDATA <span class="comment" style="color: green; line-height: 120%;">--数据从这里开始</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;"> ,USER_ID,USER_NAME,LOGIN_TIMES,LAST_LOGIN </span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">1,1,Unmi,3,2009-1-5 20:34 </span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">2,2,Fantasia,5,2008-10-15 </span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">3,3,隔叶黄
莺,8,2009-1-2 </span>
</li><li class="alt" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(255, 255, 255);"><span style="color: black; line-height: 120%;">4,4,Kypfos,<span class="op" style="color: blue; line-height: 120%;">NULL</span><span style="color: black; line-height: 120%;">,</span><span class="op" style="color: blue; line-height: 120%;">NULL</span><span style="color: black; line-height: 120%;"> </span></span>
</li><li class="" style="padding-left: 10px; border-left: 1px solid rgb(209, 215, 220); line-height: 18px; background-color: rgb(248, 248, 248);"><span style="color: black; line-height: 120%;">5,5,不知
秋,1,2008-12-23 </span></li></ol></div><br>2) 执行一样的命令:<br><br>sqlldr <a style="color: navy; text-decoration: none;" href="mailto:dbuser/dbpass@dbservice">dbuser/dbpass@dbservice</a> control=users.ctl<br><br>比
如,在控制台会显示这样的信息:<br><br><font style="background-color: rgb(0, 0, 0);" color="#ffffff">C:\>sqlldr </font><a style="color: navy; text-decoration: none;" href="mailto:dbuser/dbpass@dbservice"><font style="background-color: rgb(0, 0, 0);" color="#ffffff">dbuser/dbpass@dbservice</font></a><font style="background-color: rgb(0, 0, 0);" color="#ffffff"> control=users.ctl</font>
<p style="margin: 10px 0px;"><font style="background-color: rgb(0, 0, 0);" color="#ffffff">SQL*Loader: Release 9.2.0.1.0 - Production on 星期三
1月 7 22:26:25 2009</font></p>
<p style="margin: 10px 0px;"><font style="background-color: rgb(0, 0, 0);" color="#ffffff">Copyright (c) 1982, 2002, Oracle Corporation. All
rights reserved.</font></p>
<p style="margin: 10px 0px;"><font style="background-color: rgb(0, 0, 0);" color="#ffffff">达到提交点,逻辑记录计数4<br>达到提交点,逻辑记录计数5<br></font><br>上面的控制文
件包含的内容比较复杂(演示目的),请根据注释理解每个参数的意义。还能由此发掘更多用法。<br><br>最后说下有关 SQL *Loader
的性能与并发操作</p>
<p style="margin: 10px 0px;">1) ROWS 的默认值为 64,你可以根据实际指定更合适的 ROWS
参数来指定每次提交记录数。(体验过在 PL/SQL Developer 中一次执行几条条以上的 insert 语句的情形吗?)</p>
<p style="margin: 10px 0px;">2)常规导入可以通过使用
INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中,可以提高导入数据的
性能。当然,在很多情况下,不能使用此参数(如果主键重复的话会使索引的状态变成UNUSABLE!)。</p>
<p style="margin: 10px 0px;">3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志(是否要
alter table table1 nologging 呢?)。这个选项只能和 direct 一起使用。</p>
<p style="margin: 10px 0px;">4) 对于超大数据文件的导入就要用并发操作了,即同时运行多个导入任务.</p>
<p style="margin: 10px 0px;"> sqlldr userid=/ control=result1.ctl
direct=true parallel=true <br> sqlldr userid=/
control=result2.ctl direct=true parallel=true <br> sqlldr
userid=/ control=result2.ctl direct=true parallel=true </p>
<p style="margin: 10px 0px;"> 当加载大量数据时(大约超过10GB),最好抑制日志的产生: <br> <br>
SQL>ALTER TABLE RESULTXT nologging; <br> <br> 这样不产生REDO
LOG,可以提高效率。然后在 CONTROL 文件中 load data 上面加一行:unrecoverable,
此选项必须要与DIRECT共同应用。 <br> <br>
在并发操作时,ORACLE声称可以达到每小时处理100GB数据的能力!其实,估计能到 1-10G 就算不错了,开始可用结构
相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。<br><br><font color="#ff0000" face="黑体" size="3">(注意:一般只能用ASCII码形式,切记要转换编码,不然导入数据为空)</font><br></p>
<p style="margin: 10px 0px;">参考:1. <a style="color: navy; text-decoration: none;" href="http://www.psoug.org/reference/sqlloader.html" target="_blank">Oracle
SQL*Loader</a> -- 英文,Sql Loader 的官方使用说明,包含多种类型的 Demo<br> 2. <a style="color: navy; text-decoration: none;" href="http://www.myfaq.com.cn/2005September/2005-09-13/206612.html" target="_blank">sql loader的用法</a> -- 列出了 sql loader 的选择参数的中文说明<br>
3. <a style="color: navy; text-decoration: none;" href="http://www.cnblogs.com/chinaray/archive/2008/04/18/1160466.html" target="_blank">使用SQL Loader导入大量数据,避免使用SQL频繁写库</a> -- 一个简单的例子,快带了解 Sql
Loader 的用法<br> 4. <a style="color: navy; text-decoration: none;" href="http://www.yuanma.org/data/2006/0922/article_1573.htm" target="_blank">Oracle SQL Loader的详细语法</a><br> 5. <a style="color: navy; text-decoration: none;" href="http://soft.ccw.com.cn/programing/database/htm2008/20080925_509432.shtml" target="_blank">oracle sql loader全攻略</a> -- 还算名符其实。并讲了如何用 SQL *Plus 的
spool 或 UTL_FILE 包生成数据文件<br> 6. <a style="color: navy; text-decoration: none;" href="http://download.oracle.com/docs/cd/B10501_01/server.920/a96652/ch05.htm" target="_blank">SQL*Loader Control File Reference</a> -- 英文,控制文件使用参考<br>
7. <a style="color: navy; text-decoration: none;" href="http://blog.csdn.net/s98/archive/2005/11/08/525387.aspx" target="_blank">学习oracle sql loader 的使用</a> <br> 8. <a style="color: navy; text-decoration: none;" href="http://www.knowsky.com/388788.html" target="_blank">用
sqlloader(sqlldr)装载LOB数据</a> -- LOB 的内类是一个外部文件,用 sql loader 导入到数据库<br>
9. <a style="color: navy; text-decoration: none;" href="http://jolly10.itpub.net/post/7268/466996" target="_blank">SQLLDR直
接加载几个参数的测试</a><br> 10.<a style="color: navy; text-decoration: none;" href="http://www.remote-dba.net/teas_rem_util18.htm" target="_blank">Maximizing SQL*Loader Performance</a></p></span>
页:
[1]