将落地文件存入到oracle数据库中的方法 -- sqlldr

来源:互联网 发布:布谷鸟软件手机版 编辑:程序博客网 时间:2024/06/05 14:43

先看一段短短的shell脚本,然后再对sqlldr工具进行介绍...

##################### Insert the file into oracle database ################################
##################### Date: 2009-7-23 ###########################################
##################### Author: landry yi  ###########################################
##################### Email: yijiyong100@163.com  ###################################
##################### Copyright: Harbin Normal University@copyright2009 ####################
##################### Version:1.0.0  #############################################
user=dbbillprg
passwd=dbbillprg
source_indir="/work11/dulin/real/data/increment_out"

dbname=billing

work_path=/work11/dulin/real/data
if [ -f ${source_indir}/increment.* ]
then
     find ${source_indir} -type f -name "increment.*" | while read data_file
     do
        ${ORACLE_HOME}/bin/sqlldr  ${user}/${passwd}@${dbname}data=$data_file  direct=n control=${work_path}/null.ctl
        echo "APP:MSG:Insert file "${data_file}" into database successfully...\n"
     done
fi


其中null.ctl文件中的内容为
LOAD DATA
badfile 'disk.bad'
APPEND
INTO table BILL_ACC_INTERFACE
FIELDS TERMINATED BY ','
(
        SYSTEM_TYPE,
        filed_name,
        FILEDPOS_IN,
        FILEDPOS_out,
        data_type,
        note,
        AUDIT_FLAG
)

若想把文件录入到数据库中,文件中存放的信息也必须是规则的。
可能大家对上面的操作会产生一些疑惑,下面我们就来介绍sqlldr工具...

SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中。SQL*LOADER是大型数据
仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。现在,我们抛开其理论不谈,用实例来使
您快速掌握SQL*LOADER的使用方法。
  首先,我们认识一下SQL*LOADER。
  在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload。
  如执行:d:\oracle>sqlldr
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 11:06:42 2002
(c) Copyright 1999 Oracle Corporation.  All rights reserved.

用法: SQLLOAD 关键字 = 值 [,keyword=value,...]
有效的关键字:
    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        (全部默认)
      skip -- Number of logical records to skip  (默认0)
      load -- Number of logical records to load  (全部默认)
    errors -- Number of errors to allow          (默认50)
      rows -- Number of rows in conventional path bind array or between direct p
ath data saves
(默认: 常规路径 64, 所有直接路径)
  bindsize -- Size of conventional path bind array in bytes(默认65536)
    silent -- Suppress messages during run (header,feedback,errors,discards,part
itions)
    direct -- use direct path                    (默认FALSE)
   parfile -- parameter file: name of file that contains parameter specification
s
  parallel -- do parallel load                   (默认FALSE)
      file -- File to allocate extents from
skip_unusable_indexes -- disallow/allow unusable indexes or index partitions(默认FALSE)
skip_index_maintenance -- do not maintain indexes, mark affected indexes as unusable(默认FALSE)
commit_discontinued -- commit loaded rows when load is discontinued(默认FALSE)
  readsize -- Size of Read buffer                (默认1048576)
PLEASE NOTE: 命令行参数可以由位置或关键字指定。
前者的例子是 'sqlload scott/tiger foo';
后者的例子是 'sqlload control=foo userid=scott/tiger'.
位置指定参数的时间必须早于但不可迟于由关键字指定的参数。例如,
'SQLLOAD SCott/tiger control=foo logfile=log',
但'不允许 sqlload scott/tiger control=foo log',
即使允许参数 'log' 的位置正确。
d:\oracle>
      我们可以从中看到一些基本的帮助信息,这里,我用到的是中文的WIN2000 ADV SERVER。
  我们知道,SQL*LOADER只能导入纯文本,所以我们现在开始以实例来讲解其用法。
  一、已存在数据源result.csv,欲倒入ORACLE中FANCY用户下。
    result.csv内容:
  1,默认 Web 站点,192.168.2.254:80:,RUNNING
  2,other,192.168.2.254:80:test.com,STOPPED
  3,third,192.168.2.254:81:thirdabc.com,RUNNING
  从中,我们看出4列,分别以逗号分隔,为变长字符串。
  二、制定控制文件result.ctl
        result.ctl内容:
load data
infile 'result.csv'
into table resultxt
(resultid char terminated by ',',
website char terminated by ',',
ipport char terminated by ',',
status char terminated by whitespace)
  说明:
  infile 指数据源文件 这里我们省略了默认的 discardfile result.dsc  badfile  result.bad
  into table resultxt 默认是INSERT,也可以into table resultxt APPEND为追加方式,或REPLACE
  terminated by ',' 指用逗号分隔
  terminated by whitespace 结尾以空白分隔
  三、此时我们执行加载:
D:\>sqlldr userid=fancy/testpass control=result.ctl log=resulthis.out
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:25:42 2002
(c) Copyright 1999 Oracle Corporation.  All rights reserved.
SQL*Loader-941:  在描述表RESULTXT时出现错误
ORA-04043: 对象 RESULTXT 不存在
  提示出错,因为数据库没有对应的表。
  四、在数据库建立表
   create table resultxt
  (resultid varchar2(500),
   website varchar2(500),
   ipport varchar2(500),
   status varchar2(500))
/
  五、重新执行加载
  D:\>sqlldr userid=fancy/k1i7l6l8 control=result.ctl log=resulthis.out
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
(c) Copyright 1999 Oracle Corporation.  All rights reserved.
达到提交点,逻辑记录计数2
达到提交点,逻辑记录计数3
  已经成功!我们可以通过日志文件来分析其过程:resulthis.out内容如下:
SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 10:31:57 2002
(c) Copyright 1999 Oracle Corporation.  All rights reserved.
控制文件: result.ctl
数据文件: result.csv
错误文件: result.bad
废弃文件: 未作指定
:
(可废弃所有记录)
装载数: ALL
跳过数: 0
允许的错误: 50
绑定数组: 64 行,最大 65536 字节
继续:    未作指定
所用路径:       常规
表RESULTXT
已载入从每个逻辑记录
插入选项对此表INSERT生效
   列名                        位置      长度  中止 包装数据类型
------------------------------ ---------- ----- ---- ---- ---------------------
RESULTID                            FIRST     *    ,      CHARACTER           
WEBSITE                              NEXT     *    ,      CHARACTER           
IPPORT                               NEXT     *    ,      CHARACTER           
STATUS                               NEXT     *  WHT      CHARACTER           

表RESULTXT: 
 
 

原创粉丝点击