oracle SQL*Loader

简介:
是一个对数据装载入库的工具,适用于文本数据
常见类似工具:
imp:只适合exp工具导出的文件
impdp:只适合expdp工具导出的文件
外部表:适合文本数据,但是只能本地机器,不能远程装载
sqlldr:适合文本数据,使用简单,相对外部表更加灵活,所以对文本装载时多数采用SQL Loader
可以实现不同数据库的数据交换
特性:
1. 通过网络来加载数据,意味着能够在一个不同的系统上运行sqlldr来加载数据
2. 在一个load会话内,导入多个datafile
3. 在一个会话内,数据能够加载到多个表
4. 指定数据的字符集
5. 选择性的加载数据,when和skip,
6. 能够在load进去之前使用SQL函数,系统的,也可以是自己写的函数,
7. 生成唯一键值(可做主键)
8. 使用OS的文件系统访问数据文件,例如在Windows上将NTFS数据文件传输至
9. 数据能够从磁盘,磁带,命名管道加载
10. 生成详细的错误报告,方便故障排除
11. 能够load任意复杂的对象关系数据(主外键)
12. 使用辅助数据文件来完成加载lob和集合
13. 能够使用传统load和直接load,传统的灵活,直接的性能优越
注意:只能加载到现有表,不能创建表
权限要求:
使用insert或者append,需要insert权限
使用replace或者truncate,需要delete权限,replace就是先delete原表中的所有表,再插入
常用构成方式:
控制文件:里面包含怎样去处理数据文件的信息
数据文件:按照某种格式进行排列的数据的集合
H:\>sqlldr
2.
3.  SQL*Loader: Release 11.2.0.4.0 ‐ Production on 星期二 2月 21 15:41:07 2017
4.
5.  Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
6.
7.
8.  用法: SQLLDR keyword=value [,keyword=value,...]
9.
10.  有效的关键字:
11.
12.      userid ‐‐ ORACLE 用户名/口令
13.     control ‐‐ 控制文件名
14.         log ‐‐ 日志文件名
15.         bad ‐‐ 错误文件名
16.        data ‐‐ 数据文件名
17.     discard ‐‐ 废弃文件名
18.  discardmax ‐‐ 允许废弃的文件的数目         (全部默认)
19.        skip ‐‐ 要跳过的逻辑记录的数目  (默认 0)
20.        load ‐‐ 要加载的逻辑记录的数目  (全部默认)
21.      errors ‐‐ 允许的错误的数目         (默认 50)
22.        rows ‐‐ 常规路径绑定数组中或直接路径保存数据间的行数
23.                 (默认: 常规路径 64, 直接路径全部)
24.    bindsize ‐‐ 常规路径绑定数组的大小 (以字节计)  (默认 256000)
25.      silent ‐‐ 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)
26.      direct ‐‐ 使用直接路径                     (默认 FALSE)
27.     parfile ‐‐ 参数文件: 包含参数说明的文件的名称
28.    parallel ‐‐ 执行并行加载                    (默认 FALSE)
29.        file ‐‐ 要从以下对象中分配区的文件
30.  skip_unusable_indexes ‐‐ 不允许/允许使用无用的索引或索引分区  (默认 FALSE)
31.  skip_index_maintenance ‐‐ 没有维护索引, 将受到影响的索引标记为无用  (默认 FALSE)  
32.  commit_discontinued ‐‐ 提交加载中断时已加载的行  (默认 FALSE)
33.    readsize ‐‐ 读取缓冲区的大小               (默认 1048576)
34.  external_table ‐‐ 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE  (默认 NOT_USED
35.  columnarrayrows ‐‐ 直接路径列数组的行数  (默认 5000)
36.  streamsize ‐‐ 直接路径流缓冲区的大小 (以字节计)  (默认 256000)
37.  multithreading ‐‐ 在直接路径中使用多线程
38.   resumable ‐‐ 对当前会话启用或禁用可恢复  (默认 FALSE)
39.  resumable_name ‐‐ 有助于标识可恢复语句的文本字符串
40.  resumable_timeout ‐‐ RESUMABLE 的等待时间 (以秒计)  (默认 7200)
41.  date_cache ‐‐ 日期转换高速缓存的大小 (以条目计)  (默认 1000)
42.  no_index_errors ‐‐ 出现任何索引错误时中止加载  (默认 FALSE)
43.
44.  PLEASE NOTE: 命令行参数可以由位置或关键字指定
45.  。前者的例子是 'sqlldr
46.  scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo
47.  userid=scott/tiger'。位置指定参数的时间必须早于
48.  但不可迟于由关键字指定的参数。例如,
49.  允许 'sqlldr scott/tiger control=foo logfile=log', 但是
50.  不允许 'sqlldr scott/tiger control=foo log', 即使
51.  参数 'log' 的位置正确。

需要解释的参数:
BAD:指定文件名,默认为<数据文件名>.bad, 存放不满足约束的值
ERROR:默认50,允许错误的数目,此处错误指bad,达到数量后终止load过程,并且提交该点之前的所有数
DISCARD:指定文件名,默认为<数据文件名>.dsc, 不满足条件而被丢弃的值,当不满足控制文件中的任意
一个when,或者所有字段都为NULL,那么会被放入此文件中
DISCARDMAX:默认不限制,当达到丢弃限制后,数据文件的处理终止并且继续下一个文件
rows:常规路径中,进行插入时绑定的数据的行数
bindsize:可以看做是rows占用的缓存,并且当缓存设置不够时,rows会受bindsize限制
date_cahce:
默认值:Enabled(对于1000个以内的不同日期)。要完全禁用日期缓存功能,请将其设置为0。仅适用
于直接路径加载
日期缓存用于存储从文本字符串到内部日期格式的转换结果。缓存很有用,因为查找文本对应的日期的成
本远远少于从文本格式到日期格式的转换。如果在数据文件中重复出现相同的日期,则使用日期缓存可以
提高直接路径加载的速度。
DATE_CACHE指定日期缓存大小(在entries中)。例如,DATE_CACHE=5000指定每个创建的日期缓存最
多可以包含5000个不同的日期条目。每个表都有自己的日期缓存,如果需要的话。仅当至少一个日期或
时间戳值被加载, 并需要进行数据类型转换才能存储在表中时,才创建日期高速缓存。
日期缓存功能仅适用于直接路径加载。默认情况下启用。默认日期缓存大小为1000个元素。如果使用默
认大小,并且加载的唯一输入值数量超过1000,则会自动为该表禁用日期缓存功能。但是,如果覆盖默
认值并指定非零的日期缓存大小,并且超过了该大小,则不会禁用缓存。关于是否自动替换这个事,并没
有想到什么对策来验证
您可以使用日志文件中包含的日期高速缓存统计信息(entries, hits, and misses)来调整高速缓存
的大小,以便将来进行类似加载。
DIRECT:直接加载
默认false,使用常规方式
当改之为true时,启动直接路径方式
LINUX系统下:
需求一、单数据文件导入一张数据表中
  文字是苍白的,事例才是震撼的,所以举例说明:
1、创建 测试 表:
conn scott/tiger
create table test_loader_1(id number(4),name varchar2(20));
2 创建控制文件
vi user.ctl
LOAD DATA
INFILE '/u01/app/oracle/1.txt'
APPEND INTO TABLE test_loader_1
FIELDS TERMINATED BY ',' --数据文件中的数据要用,隔开即可
TRAILING NULLCOLS
(ID,NAME)

3. 创建数据文件test1.txt
vi 1.txt
1,a
2,b

4.oracle 用户
sqlldr userid=scott/tiger control=/u01/app/oracle/user.ctl parallel=true

windows系统下:
  需求一、单数据文件导入一张数据表中
         文字是苍白的,事例才是震撼的,所以举例说明:
        1、创建 测试 表:
             create table test_loader_1(id number(4),name varchar2(20));
        2、创建一个bat文件(在windows下可以直接调用命令行的)
             sqlldr userid=scott/ruiyuan control=D:\sqlloader\user.ctl parallel=true    --特别注意,一个sqlldr只能写一个控制文件
        3、创建一个控制文件.ctl文件
             LOAD DATA 
             INFILE 'D:\sqlloader\test1.txt'
             APPEND INTO TABLE test_loader_1
             FIELDS TERMINATED BY X'09'            --(Tab分隔符)
             TRAILING NULLCOLS 
             (ID,NAME)  
           4、创建数据文件test1.txt,内容为
                 1             a
                 2             b
           准备工作已经结束,直接点击bat,之后查询test_loader_1表,就会看到有两条数据。
        需求二、多数据文件导入一张数据表中
         1、创建测试表:
             create table test_loader_1(id number(4),name varchar2(20));
        2、创建一个bat文件(在windows下可以直接调用命令行的)
             sqlldr userid=scott/ruiyuan control=D:\sqlloader\user.ctl parallel=true
        3、创建一个控制文件.ctl文件
             LOAD DATA 
             INFILE 'D:\sqlloader\test1.txt'
             INFILE 'D:\sqlloader\test2.txt'    
             APPEND INTO TABLE test_loader_1
             FIELDS TERMINATED BY X'09'            --(Tab分隔符)
             TRAILING NULLCOLS 
             (ID,NAME)  
         4、创建数据文件test1.txt和test2.txt,内容为
             test1.txt
             1             a
             2             b
             test2.txt
             3            c
             4            d
        准备工作已经结束,直接点击bat,之后查询test_loader_1表,就会看到数据在里面了。
        需求三、单数据文件导入多张数据表中
         1、创建测试表:
             create table test_loader_1(id number(4),name varchar2(20));
             create table test_loader_2(id number(4),name varchar2(20),password varchar2(20));
        2、创建一个bat文件(在windows下可以直接调用命令行的)
             sqlldr userid=scott/ruiyuan control=D:\sqlloader\user.ctl parallel=true
        3、创建一个控制文件.ctl文件        
             LOAD DATA 
             INFILE 'D:\sqlloader\test1.txt'
             APPEND INTO TABLE test_loader_1 
             WHEN TAB='ABC' 
             FIELDS TERMINATED BY X'09'
            TRAILING NULLCOLS
            (TAB FILLER POSITION(1:3),ID,NAME)  
            INTO TABLE test_loader_2
            WHEN TAB='CBA' 
            FIELDS TERMINATED BY X'09'
           TRAILING NULLCOLS
           (TAB FILLER POSITION(1:4),  
            ID,  
            NAME,
            PASSWORD
            )  
         4、创建数据文件test1.txt内容为
             test1.txt
             ABC1             a
             ABC2             b
             CBA3             c
             CBA4             d
        准备工作已经结束,直接点击bat,之后查询test_loader_1和test_loader_2表,就会看到数据在里面了。
        需求四、多数据文件导入多张数据表中
           1、创建测试表:
             create table test_loader_1(id number(4),name varchar2(20));
             create table test_loader_2(id number(4),name varchar2(20),password varchar2(20));
        2、创建一个bat文件(在windows下可以直接调用命令行的)
             sqlldr userid=scott/ruiyuan control=D:\sqlloader\user.ctl parallel=true
        3、创建一个控制文件.ctl文件        
             LOAD DATA 
             INFILE 'D:\sqlloader\test1.txt'
             INFILE 'D:\sqlloader\test2.txt'
             APPEND INTO TABLE test_loader_1 
             WHEN TAB='ABC' 
             FIELDS TERMINATED BY X'09'
            TRAILING NULLCOLS
            (TAB FILLER POSITION(1:3),ID,NAME)  
            INTO TABLE test_loader_2
            WHEN TAB='CBA' 
            FIELDS TERMINATED BY X'09'
           TRAILING NULLCOLS
           (TAB FILLER POSITION(1:4),  
            ID,  
            NAME,
            PASSWORD
            )  
         4、创建数据文件test1.txt内容为
             test1.txt
             ABC1             a
             ABC2             b
             CBA3             c
             CBA4             d
             test2.txt
             ABC1             a
             ABC2             b
             CBA3             c
             CBA4             d

      准备工作已经结束,直接点击bat,之后查询test_loader_1和test_loader_2表,就会看到数据在里面了。
       

你可能感兴趣的:(oracle,数据库)