oracle sql loader 

Oracle SQL LOADER是Oracle的数据加载工具,用来将固定格式的文本文件中数据加载到Oracle数据库中。它提供了最快捷的加载途径(direct / parallel),是大数据快速加载的完美工具。在数据仓库应用中用得较多。我们介绍一下它的速成使用方法,快速掌握它。

 

一、确定加载文件内容格式和文件的字符集编码


导入的文本文件有以txt或csv为后缀名的,它的编码方式通常有gb2312和utf8两种。
例如,csv文件的内容格式如下所示:

Csv代码  \"收藏代码\"/

  1. "admin","55de42146747ea457c2bab5064b7019c","webmastor@yourdomain.com","d0d8e1"

  2. "huangomeng","2bdca6d6a6cb20f1f2483d0a9d13e621","huangomeng@163.com","145288"

  3. "乐友","ee39f6b01424c1408d17d027da0b85a1","zhnaeu@yahoo.cn","a2fb84"

  4. "贝龙","894a14224560a9792f0a21673642e2cc","50187908@163.com","583815"

 
每个字段是双引号括上,字段之间以逗号分隔开。基本上csv的格式都是这样。
另外,还注意不同的编码字符集,gb2312和utf8等字符集之间的区别要记住。在写sqlldr控制文件时需要用到。

二、编写正确的数据加载控制文件

加载字符集ZHS16GBK的文本文件的控制文件bb_11g.ctl的内容如下:

Ctl代码  \"收藏代码\"/

  1. LOAD DATA  

  2. CHARACTERSET ZHS16GBK  

  3. INFILE 'D:\\uc_members_20121130.csv'

  4. BADFILE 'D:\\uc_members_20121130.bad'

  5. DISCARDFILE 'D:\\uc_members_20121130.dsc'

  6. truncate  

  7. into table T_USER_INFO  

  8. (USERNAME CHAR terminated by ',' OPTIONALLY ENCLOSED BY '"' ,  

  9.  PASSWD CHAR terminated by ',' OPTIONALLY ENCLOSED BY '"',  

  10.  EMAIL CHAR terminated by ',' OPTIONALLY ENCLOSED BY '"' ,  

  11.  SALT char terminated  by  whitespace OPTIONALLY ENCLOSED BY '"')  

 
这里的字符集名称和数据库的字符集名称一致。如果字符集不匹配,在加载数据进入数据库后,你会发现中文或其他文件的都会是乱码。
如果数据库字符集是ALT32UTF8,那么需要将"CHARACTERSET ZHS16GBK"修改为"CHARACTERSET UTF8"。


字段分隔符说明:
terminated   by   x'09'       ,指字段以X'09' -- 制表符(TAB)分隔   
terminated   by  ','          ,指用逗号分隔 
terminated   by   whitespace ,指结尾以空白分隔   


三、使用sqlldr程序根据控制文件导入文本文件到数据库

在windows的cmd下执行sqlldr,实现数据快速加载。

Cmd代码  \"收藏代码\"/

  1. sqlldr scott/tiger@elvdb_11g control=d:\\bb_11g.ctl log=d:\\dd_11g.log  

 
在执行结束后,记住去检查log文件。日志文件会显示加载的详细信息。

Log代码  \"收藏代码\"/

  1. SQL*Loader: Release 10.2.0.1.0 - Production on 星期五 11月 30 10:17:44 2012

  2. Copyright (c) 19822005, Oracle.  All rights reserved.  

  3. 控制文件:      D:/bb_11g.ctl  

  4. 为全部输入指定了字符集 ZHS16GBK。  

  5. 数据文件:      D:\\uc_members_20121130.csv  

  6.   错误文件:    D:\\uc_members_20121130.bad  

  7.   废弃文件:    D:\\uc_members_20121130.dsc  

  8. (可废弃所有记录)  

  9. 要加载的数: ALL  

  10. 要跳过的数: 0

  11. 允许的错误: 50

  12. 绑定数组: 64 行, 最大 256000 字节  

  13. 继续:    未作指定  

  14. 所用路径:       常规  

  15. 表 T_USER_INFO,已加载从每个逻辑记录  

  16. 插入选项对此表 TRUNCATE 生效  

  17.    列名                        位置      长度  中止 包装数据类型  

  18. ------------------------------ ---------- ----- ---- ---- ---------------------  

  19. USERNAME                            FIRST     *   ,  O (") CHARACTER             

  20. PASSWD                               NEXT     *   ,  O (") CHARACTER             

  21. EMAIL                                NEXT     *   ,  O (") CHARACTER             

  22. SALT                                 NEXT     *  WHT O (") CHARACTER             

  23. 表 T_USER_INFO:  

  24.   1132907 行 加载成功。  

  25.   由于数据错误, 0 行 没有加载。  

  26.   由于所有 WHEN 子句失败, 0 行 没有加载。  

  27.   由于所有字段都为空的, 0 行 没有加载。  

  28. 为绑定数组分配的空间:                 66048 字节 (64 行)  

  29. 读取   缓冲区字节数: 1048576

  30. 跳过的逻辑记录总数:          0

  31. 读取的逻辑记录总数:       1132907

  32. 拒绝的逻辑记录总数:          0

  33. 废弃的逻辑记录总数:        0

  34. 从 星期五 11月 30 10:17:44 2012 开始运行  

  35. 在 星期五 11月 30 10:18:23 2012 处运行结束  

  36. 经过时间为: 000039.22

  37. CPU 时间为: 000006.16

 

从日志文件中可以看到,加载110万条记录,只要39秒。如果有错误或废弃的记录,可以到对应的文件中去查看一下。


四、注意事项
1、导入的文本文件有时候会很大,使用文本编辑工具可能很难打开。可以尝试一下vi。
2、导入的目标表上最好没有主键,没有索引,没有约束,使用nologging设置尽量减少日志生成量。
3、导入的文本文件最好所有的格式都是字符串或数字。如果是时间,需要将它和NSL_DATE_FORMAT保持一致。
4、对于LOB字段,sqlldr爱莫能助。