zoukankan      html  css  js  c++  java
  • 使用sqlldr将文件中的数据导入到数据库

    1.创建数据文件:

    ?如,在D:创建 zhaozhenlong.txt 文件,文件内容为:

    11,12,13
    21,22,23
    31,32,33

    2、创建控制文件:

    如,在D:创建 zhaozhenlong.ctl 文件,文件内容为:

    load da ta
    infile 'd:zhaozhenlong.txt'
    append into table zhaozhenlong
    fields terminated by ','
    (c1,c2,c3)

    3、在数据库中创建表:

    create table zhaozhenlong(c1 varchar(20),c2 varchar(20),c3 varchar2(20));


    4、在‘开始’/‘运行’中,执行:

    sqlldr userid=cs/cs@orademo control=d:zhaozhenlong.ctl

    5、查询数据库:

    select * from zhaozhenlong

    结果为:

    ?C1 C2 C3
    1 11 12 13
    2 21 22 23
    3 31 32 33

    ?

    例2:

    ?

    ?关于 oracle 中 sqlldr 的用法


    2005-12-30 21:13:49
    大 中 小
    这几天研究了一下 sqlldr 的用法,今天在这里写出来供有需要的同行享用.
    现在有一个文件 Output.txt 内容如下:
    ?
    Ivy,Lam,PR02004,2005,09,21,17,32,00,I,D,Main Door,PR,
    Carmen,Siu,AC04023,2005,09,21,17,32,01,I,D,Main Door,Account,
    Xing,Lee,CM06021,2005,09,21,17,32,02,I,D,Main Door,Communications,
    Barry,Yu,MK05006,2005,09,21,17,32,02,I,D,Main Door,Marketing,
    Overtime,nil,OV0001,2005,09,21,17,32,07,I,D,Main Door,Product,
    Sammy,Mow,SA02322,2005,09,21,17,32,09,I,D,Main Door,Sales,
    Emily,Fu,CM06024,2005,09,21,17,32,10,I,D,Main Door,Communications,
    Stella,Chow,PT02145,2005,09,21,17,32,11,I,D,Main Door,Product,
    ?
    是有规律的数据,中间都是用","分开的,现在我要将此文件导入到 oracle 中:
    ?
    第一步,当然是建表,上面有一行中有几个数据就建几个字段.
    ?
    二,写一个 *.ctl 的文件,内容如下
    ?
    load da ta
    infile 'D:owenworkCardAttendenceCompletedwindowsOutput.txt'
    badfile 'D:owenworkCardAttendenceCompletedwindowsOutput.bad'
    append
    into table system.card_time_original
    fields terminated by ","
    (lName,fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)

    三,在 doc 窗口下输入如下命令
    ?
    sqlldr userid=system/111111@XE control=D:owenworkCardAttendenceCompletedwindowsimp ortOne.ctl log=D:owenworkCardAttendenceCompletedwindowsimp ort.log
    ?
    注意:这里一定要是当前用户对此表有所有权限, 还有一定不能用 sys 用户,要不然会出错
    ?
    如果要将此数据导入到两个表中(结构相同),那么可以把控制文件改为如下所示:
    ?
    load da ta
    infile 'D:owenworkCardAttendenceCompletedwindowsOutput.txt'
    badfile 'D:owenworkCardAttendenceCompletedwindowsOutput.bad'
    append
    into table system.card_time_original
    WHEN lName != ' '
    fields terminated by ","
    (lName POSITION(1),fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)
    into table system.card_time_original_bak
    WHEN lName != ' '
    fields terminated by ","
    (lName POSITION(1),fName,emp_id,year,month,day,hour,minute,second,inOut,status,doorName,dept)
    ?


    FAQ_SQLLDR用法总结

    在数据仓库项目实施过程中,ETL是重要的一环,实施的好与坏,关系到项目的成功与否。
    在数据抽取领域,相应的工具有IBM DataStage,Informatica PowerCenter,这里介绍Oracle自带的SQLLODER,
    这是在Oracle数据仓库实施过程中最容易掌握的工具。在介绍之前,先考虑下面问题:

    ?一、注意SQLLDR要解决的问题,即实现ETL过程的问题

    1、导入表的数据类型为日期类型

    2、导入数据过程中的转换问题

    3、导入数据过程中的过滤问题

    4、导入数据过程中的截取问题

    5、导入空列在转换时可能会遇到的问题

    6、导入数据的分割符问题,如逗号,制表符,空白符都是常见的

    用法:

    二、控制文件:一个控制命令的脚本文件,通常以ctl结尾,Test.ctl内容如下:

    ?

    LOAD DA TA

    INFILE 'F:SQLLDRda ta.txt'

    INFILE 'F:SQLLDRda ta2.txt' //可以从多个文件导入数据

    // INFILE * //导入的内容在本文件最后的BEGINDATA后面就是导入的内容

    INTO TABLE sdata.T_TEST

    ?

    //四种装载方式,四选一

    APPEND // 原先的表有数据 就加在后面

    // INSERT //装载空表 如果原先的表有数据 sqlloader会停止 默认值

    // REPLACE // 原先的表有数据 原先的数据会全部删除

    // TRUNCATE // 指定的内容和replace的相同 会用truncate语句删除现存数据

    ?

    //过滤装载的数据

    WHEN T_DATE = '2007-07-02' //大于和小于等其它比较还没解决

    ?

    //指定分割符

    FIELDS TERMINATED BY ',' // x'09' (制表符)

    -- FIELDS TERMINATED BY WHITESPACE //以空白分割,实际这样分割危险

    OPTIONALLY ENCLOSED BY '"'

    TRAILING NULLCOLS // 表的字段没有对应的值时允许为空 ,这句很有用,默认加的好

    ?

    //表的字段,可以在里面大做文章

    (

    T_ID FILLER, // FILLER 关键字 此列的数值不会被装载

    T_DATE "CASE WHEN :T_DATE is null THEN TO_DATE('2999-12-31','yyyy-mm-dd') ELSE TO_DATE(:T_DATE,'yyyy-mm-dd') END",

    ?//日期类型特别说明,并且要指定其格式

    //更一般的格式是T_DATE date ‘yyyy-mm-dd’

    T_NAME POSITION(3:6) "UPPER(:T_NAME)", //用位置POSITION来告诉装载的数据

    //"UPPER(:T_NAME)" 转换为大写,注意冒号

    T_SEX position(*:8) , // 这个字段的开始位置在前一字段的结束位置

    ENTIRE_LINE "UPPER(:T_NAME||:T_SEX)" //连接并转换为大写

    )

    ?

    /****可继续 插入数据到其他表

    INTO TABLE sdata.T_TEST

    INSERT

    WHEN T_DATE = '2007-07-02' ? //大于和小于等其它比较还没解决

    .//BEGINDATA // 与前面的INFILE?*对应,一般不会这样用吧?

    //1,ajsdlkfjsdkl,0?

    ?

    三、运行方法

    命令窗口执行:

    sqlldr userid=sdata/sdata@rasdevdb control=F:SQLLDRTest.ctl?

    为了方便,一般写个bat 文件,在bat文件中输入上述的内容即可,最后在命令窗口中运行这个bat文件,原理是一样的。

    总之,这其实是Oracle中的一个用法而已。


    三、

    对不规则数据源的处理

    ?

    --TRAILING NULLCOLS // 表的字段没有对应的值时允许为空,这句很有用

    例如:

    对于由EXCEL文件导出成CSV文件时,有的行末没有数据会缺少分割符,这在DS中会报错的,在SQLLD

  • 相关阅读:
    Linux常用命令(二)
    C#异步调用
    Ajax运用总结
    SQL Server2005 FOR XML PATH 语句的应用
    SQL Server 2005 处理交叉表
    如何控制并发和控制死锁(内含pb的处理要点)
    WPF 中的换行符
    C#委托的异步调用
    pivot 附近有语法错误,您可能需要将当前数据库的兼容级别设置为更高的值。
    应用系统BUG分布小结
  • 原文地址:https://www.cnblogs.com/hllnj2008/p/5012769.html
Copyright © 2011-2022 走看看