redirect_to :future #思维驱动 » Blog Archive » sqlldr导数据时如何去头尾记录。

sqlldr导数据时如何去头尾记录。

sqlldr导大量数据的时候因为其可以直接写数据文件,所以速度比insert快很多,实际工作中经常使用。

时候我们会遇到有文档格式的统计文件,如文件包含文件头及文件尾(第一行和最后一行),这些记录一般为统计信息,不需要入库。如何去除头尾记录呢?经过查看sqlldr的帮助发现去前面多少行其实很简单 skip=n 就行了。那去除最后几行呢?没有相应的说明,是不是 skip=-n 就可以了呢?嘿嘿嘿,兄弟这不是perl也不是python,不能这样子的。。。
那要怎么做呢?继续看帮助,发现一个参数:load — Number of logical records to load (Default all),噢,这不是解决了嘛。。。算一下文件记录数,再减头尾记录数做为load参数的值就行了。
如何使用这个参数呢?就是算出文件总记录数,然后减去你要去的头尾记录的行数。skip=要去除的文件头行数,load=实际要入的记录数就可以了。怎么实现呢?这正是展现*nix/linux灵活、强大的地方(windowns可能也有相应的功能吧,只是我不知道,如果实在不行就装个cygwin吧)。

版权声明:可以任意转载,转载时请务必标明文章原始出处、作者及本声明:http://www.upulife.com

使用各种工具程序,我们使用下面这段代码就能解决问题了。

简单说明一下
wc:文件行数,单词数,字符数统计.
awk:叫什么呢? Pattern scanning and processing language,也是个脚本语言吧。
bc:数学表达式计算.
$?表示取前一个命令的返回值.
其它的就不说了吧,自己看shell教程去。

cd /file
ls A*.*| while read $fn
do
cnt=`wc $tmp|awk ‘{print $1}’` #取得文件行数
cnt=`echo $cnt-2|bc` #将文件行数减去2行(头尾记录)
#skip=1去第一行,$cnt为总记录数减2,即去了头尾记录的记录数。
sqlldr usn/pwd@db /ctl/test.ctl skip=1 load=$cnt data= $fn
ret=$?
if [ $ret -ne 0 ];then #失败退出。
exit 1;
fi
mv $fn /backup #成功备份。
done

上面这段代码在hpux下测试通过,不过在其它unix系系统也应该一样可以使用,(出于某些原因上面代码改了些目录及文件名)

怎么样?这样的处理方式很unix吧?
就是每个程序专注于做好一件事,并易于扩展,使用小程序组程在大系统,这样模块间关联小,程序简单维护容易。我们现在很多系统都是使用这种unix”哲学”开发的。无论是写程序还是查问题都巨爽无比,因为一个2000行的程序和10个200行的程序–指C程序,比较起来哪个简单可想而知了。不过也不是没有缺点,模块数量如果控制不好,就容易造成大量的模块间输入输出,增加系统负荷。而且如果模块太多的话会造成大量的模块间流程配置,这是一个令人很头痛的问题—或者像perl称之为胶水语言的东西正是为了解决这种问题而诞生的吧—我瞎说的。

sqlldr参数如下:
xxxxxxx$sqlldr

SQL*Loader: Release 9.2.0.5.0 - Production on Mon Jul 25 16:26:34 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Usage: SQLLDR keyword=value [,keyword=value,…]

Valid Keywords:

userid — ORACLE username/password
control — Control file name
log — Log file name
bad — Bad file name
data — Data file name
discard — Discard file name
discardmax — Number of discards to allow (Default all)
skip — Number of logical records to skip (Default 0)
load — Number of logical records to load (Default all)
errors — Number of errors to allow (Default 50)
rows — Number of rows in conventional path bind array or between direct path data saves
(Default: Conventional path 64, Direct path all)
bindsize — Size of conventional path bind array in bytes (Default 256000)
silent — Suppress messages during run (header,feedback,errors,discards,partitions)
direct — use direct path (Default FALSE)
parfile — parameter file: name of file that contains parameter specifications
parallel — do parallel load (Default FALSE)
file — File to allocate extents from
skip_unusable_indexes — disallow/allow unusable indexes or index partitions (Default FALSE)
skip_index_maintenance — do not maintain indexes, mark affected indexes as unusable (Default FALSE)
commit_discontinued — commit loaded rows when load is discontinued (Default FALSE)
readsize — Size of Read buffer (Default 1048576)
external_table — use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE (Default NOT_USED)
columnarrayrows — Number of rows for direct path column array (Default 5000)
streamsize — Size of direct path stream buffer in bytes (Default 256000)
multithreading — use multithreading in direct path
resumable — enable or disable resumable for current session (Default FALSE)
resumable_name — text string to help identify resumable statement
resumable_timeout — wait time (in seconds) for RESUMABLE (Default 7200)
date_cache — size (in entries) of date conversion cache (Default 1000)

PLEASE NOTE: Command-line parameters may be specified either by
position or by keywords. An example of the former case is ’sqlldr
scott/tiger foo’; an example of the latter is ’sqlldr control=foo
userid=scott/tiger’. One may specify parameters by position before
but not after parameters specified by keywords. For example,
’sqlldr scott/tiger control=foo logfile=log’ is allowed, but
’sqlldr scott/tiger control=foo log’ is not, even though the
position of the parameter ‘log’ is correct.
xxxxxxx$

看完啦?再看看我们最近的10条记录对您是否有用呢?

要不,再找找其它内容:




或者给我们留下些意见、建议,这将给我们莫大的鼓励,促使我们做得更好。