一、基本知识
Oracle 的 SQL* LOADER 可以将外部格式化的文本数据加载到数据库表中。通常 与 SPOOL导出文本数据方法配合使用。
1、命令格式
SQLLDR keyword=value [,keyword=value,……]
例:\( sqlldr user/pwd control=emp.ctl data=emp.dat bad=emp.bad log=emp.log</p><p><strong> 2、控制文件</strong></p><p> SQL*LOADER 根据控制文件可以找到需要加载的数据。并且分析和解释这些数据。</p><p> 控制文件由三个部分组成,具体参数参考帮助文档:1. 全局选件,行,跳过的记录数等;2. INFILE 子句指定的输入数据;3. 数据特性说明。</p><p> comment: ——注释</p><p> 例:</p><p> load data infile *</p><p> append ——除了 append外,还有 insert、replace、truncate等方式</p><p> into table emp fields terminated b y ‘|’</p><p> (</p><p> no float external, name char(20),</p><p> age integer external,</p><p> duty char(1),salary float external,</p><p> upd_ts date(14) ‘YYYYMMDDHH24MISS’)</p><p> begindata</p><p> 3|Mulder|000020|1|000000005000|000</p><p> 4|Scully|000025|2|000000008000|959</p><p> 控制文件中infile选项跟sqlldr 命令行中data 选项含义相同,如使用infile *则表明数据在本控制文件以 begin data 开头的区域内。 一些选项:FIELDS TERMINATED BY WHITESPACE FIELDS TERMINATED BY x'09' FILLER_1 FILLER, // 指定某一列将不会被装载</p><p> DEPTNO position(1:2), DNAME position(*:16), // 指定列的位置SEQNO RECNUM //载入每行的行号</p><p> SKIP n // 指定导入时可以跳过多少行数据</p><p><strong> 3、数据文件</strong></p><p> 按控制文件数据格式定义的数据行集,</p><p> 例:</p><p> 1|Tom|000020|1|000000005000|000</p><p> 2|Jerry|000025|2|000000008000|959</p><p> 固定格式、可变格式、流记录格式:</p><p> 固定格式:</p><p> 当数据固定的格式(长度一样)时且是在文件中得到时,要用 INFILE "fix n"</p><p> load data</p><p> infile 'example.dat' "fix 11"</p><p> into table example</p><p> fields terminated b y ',' optionally enclosed by '"'</p><p> (col1 char(5), col2 char(7)) example.dat:</p><p> 001, cd, 0002,fghi,</p><p> 00003,lmn,</p><p> 1, "pqrs",</p><p> 0005,uvwx,</p><p> 可变格式:</p><p> 当数据是可变格式(长度不一样)时且是在文件中得到时,要用 INFILE "var n".如:</p><p> load data</p><p> infile 'example.dat' "var 3"</p><p> into table example</p><p> fields terminated b y ',' optionally enclosed by '"'</p><p> (col1 char(5), col2 char(7)) example.dat:</p><p> 009hello,cd,010world,im,</p><p> 012my,name is,</p><p> 流记录格式: // Stream-recored format:load data infile 'xx.dat' "str '| '"</p><p> into table xx field terminated b y ',' optionally enclosed by '"'</p><p> (col1 char(5), col2 char(7))</p><p> example.dat:</p><p> hello, ccd,|</p><p> world, bb,|</p><p><strong> 4、坏文件</strong></p><p> bad=emp.bad坏文件包含那些被 SQL*Loader拒绝的记录。被拒绝的记录可能是不符合要求的记录。</p><p><strong> 5、日志文件及日志信息</strong></p><p> log=emp.log当 SQL*Loader 开始执行后,它就自动建立 日志文件。日志文件包含有加载的总 结,加载中的错误信息等。</p><p></p><p><strong> 二、高级选项</strong></p><p> <strong>1、Conventional Path Load与Direct Path Load</strong></p><p> Conventional-path Load:通过常规通道方式上载。</p><p> 特点:commit, always gen redo logs, enforce all constraints, fire insert triggers, can load into cluster, other user can make change</p><p> rows:每次提交的记录数</p><p> bindsize:每次提交记录的缓冲区</p><p> readsize:与 bindsize 成对使用,其中较小者会自动调整到较大者</p><p> sqlldr 先计算单条记录长度,乘以 rows,如小于 bindsize,不会试图扩张,rows以填充 bindsize;如超出,则以 bindsize 为准。 命令为:</p><p> \) sqlldr dbuser/oracle control=emp.ctl log=emp.log rows=10000 bindsize=
Direct-Path Load:
通过直通方式上载,可以跳过数据库的相关逻辑,不进行 SQL解析,而直接将数 据导入到数据文件中。
特点:save, conditionly gen redo logs, enforce PK UK NN, not fire triggers, can not load into cluster, other user can not make change命令为:
\( sqlldr dbuser/oracle control=emp.ctl log=emp.log direct=true</p><p> <strong>2、SPOOL导出文本数据方法</strong></p><p> 导入的数据文件可以用 SPOOL导出文本数据方法生成。</p><p> SQL*PLUS环境设置</p><p> SET NEWPAGE NONE HEADING OFF SPACE 0</p><p> PAGESIZE 0 SET TRIMOUT ON TRIMSPOOL ON LINESIZE 2500</p><p> 注:LINESIZE 要稍微设置大些,免得数据被截断,它应和相应的 TRIMSPOOL结合使用防止导出的文本有太多的尾部空格。</p><p> 但是如果 LINESIZE 设置太大,会大大降低导出的速度,另外在 WINDOWS下导 出最好不要用 PLSQL导出,速度比较慢,直接用 COMMEND 下的 SQLPLUS命令最 小化窗口执行。对于字段内包含很多回车换行符的应该给与过滤,形成比较规矩的文本 文件。</p><p> 通常情况下,我们使用 SPOOL方法,将数据库中的表导出为文本文件,如下述:</p><p> set trimspool on</p><p> set linesize 120 pagesize 2000 newpage 1 heading off term off spool 路径+文件名</p><p> select col1||','||col2||','||col3||','||col4||'……' from tablename;</p><p> spool off</p><p></p><p><strong> 三、脚本</strong></p><p> 1<strong>、</strong>将表中数据记录导出为字段值用分隔符'|'分开的。dat文件</p><p> #!/bin/ksh</p><p> </p><p> 名称: unloadtable</p><p> 功能: 本 shell 用于将表中数据记录导出</p><p> 导出为字段值用分隔符'|'分开的。dat文件</p><p> 编者:</p><p> 日期: 2006.03.18</p><p> </p><p> if [ \)# -ne 3 ]
then echo "usage:unloadtable tablename username password."
exit 0
fi
准备工作

echo "set heading off " >/tmp/\(1.col</p><p> echo "set pagesize 0" >>/tmp/\)1.col
echo "set linesize 800 " >>/tmp/\(1.col</p><p> echo "set feedback off " >>/tmp/\)1.col
echo "set tab off " >>/tmp/\(1.col</p><p> echo "select column_name||',' from user_tab_columns where lower(table_name)='\)1’ order by
column_id; " >> /tmp/\(1.col</p><p> 产生 select 语句</p><p> echo "set heading off " >/tmp/\)1.sel
echo "set pagesize 0" >>/tmp/\(1.sel</p><p> echo "set linesize 800 " >>/tmp/\)1.sel
echo "set feedback off " >>/tmp/\(1.sel</p><p> echo "set tab off " >>/tmp/\)1.sel
echo "select " >>/tmp/\(1.sel</p><p> echo `sqlplus -s \)2/\(3 < /tmp/\)1.col |sed "s/,/||'|'||/g" |sed "s/||$//g"|sed "s/date/"date"/g"</p><p> >>/tmp/$1.sel</p><p> 生成 dat文件</p><p> #echo "from $1; /" >>/tmp/$1.sel 由于 / 导致多执行一次 select</p><p> echo "from $1; " >>/tmp/$1.sel</p><p> sqlplus -s $2/$3 < /tmp/$1.sel >$1_tmp.dat</p><p> #awk '{if(FNR!=1) print $0}' $1_tmp.dat >$1.dat FNR 选项使得第一条记录选不出</p><p> awk '{print $0}' $1_tmp.dat >$1.dat</p><p> rm -f $1_tmp.dat</p><p> <strong>2、将数据导入到相应表中</strong></p><p> #!/bin/ksh</p><p> </p><p> 名称:loadtable</p><p> 功能:本 shell 用于将已经准备好的。dat数据文件导入相应的表中</p><p> .dat 文件各个字段值用分隔符'|'分开。</p><p> 编者:</p><p> 日期: 2006.03.18</p><p> </p><p> if [ $# -ne 3 ]</p><p> then</p><p> echo "usage:loadtable tablename username password." exit 0 fi</p><p> 准备工作</p><p> echo "set heading off " >/tmp/$1.colsql</p><p> echo "set pagesize 0" >>/tmp/$1.colsql</p><p> echo "set linesize 800 " >>/tmp/$1.colsql</p><p> echo "set feedback off " >>/tmp/$1.colsql</p><p> echo "set tab off " >>/tmp/$1.colsql</p><p> echo "select column_name||',' from user_tab_columns where lower(table_name)='$1' order by</p><p> column_id; " >> /tmp/$1.colsql</p><p> 产生 ctl文件</p><p> echo "load data" >/tmp/$1.ctl</p><p> echo "infile *" >>/tmp/$1.ctl</p><p> echo "into table $1" >>/tmp/$1.ctl</p><p> echo "fields terminated by '|'" >>/tmp/$1.ctl</p><p> echosqlplus -s \(2/\)3 < /tmp/\(1.colsql` |sed "s/,\)/)/g" |sed "s/^/(/g" >>/tmp/\(1.ctl</p><p> 开始导入数据</p><p> echo "truncate table \)1;" >/tmp/\(1.sql</p><p> sqlplus \)2/\(3 < /tmp/\)1.sql
sqlldr \(2/\)3 data=\(1.dat control=/tmp/\)1.ctl log=/tmp/$1.log

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/167796.html