读书笔记:SQLLDR数据加载实战指南:从问题到解决方案
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
SQLLDR数据加载实战指南:从问题到解决方案
数据太长怎么办?——解决字段超长错误
问题场景:
当你看到这样的错误提示时:
Record 4: Rejected - Error on table DEPT, column DNAME.
Field in data file exceeds maximum length
别慌!这是因为SQLLDR默认认为每个字段最多255个字符,就像快递员默认每个包裹都不超过255大小一样。
解决方案:
假设你的部门名称字段能存1000个字符:
SQL> alter table dept modify dname varchar2(1000);
在控制文件中明确告诉SQLLDR字段长度:
LOAD DATA
INFILE *
INTO TABLE DEPT
FIELDS TERMINATED BY ','
(DEPTNO, DNAME char(1000), LOC) ← 关键在这里!
BEGINDATA
...
简单说: 超过255字符?加个char(长度)就行!
处理带分隔符的数据——CSV文件的正确打开方式
标准CSV格式处理
CSV文件就像用逗号分格的表格,文字用引号保护起来:
控制文件写法:
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
数据示例:
10,Sales,"Virginia,USA"
20,Accounting,"Va, ""USA"""
30,Consulting,Virginia
加载结果:
"Virginia,USA"→ 保留逗号,显示为Virginia,USA"Va, ""USA"""→ 双引号变单引号,显示为Va, "USA"
要点:
- 包含逗号的文本要用引号括起来
- 文本中的引号要写成两个引号
制表符分隔的数据处理
两种方式,效果完全不同:
方式1:按空白分隔
FIELDS TERMINATED BY WHITESPACE
数据:10 Sales Virginia → 正确识别三个字段
方式2:严格按制表符分隔
FIELDS TERMINATED BY X'09'
数据:10 Sales Virginia → 第二个字段为空!
跳过不需要的列
就像收快递时跳过不需要的包裹:
(DEPTNO, dummy1 filler, DNAME, dummy2 filler, LOC)
用filler关键字告诉SQLLDR:"这个字段看看就好,不用入库"
固定宽度数据——老式但高效的加载方式
固定宽度文件就像填表格,每个字段的位置和长度都是固定的:
基础用法:
( DEPTNO position(1:2), ← 第1-2字节
DNAME position(3:16), ← 第3-16字节
LOC position(17:29) ← 第17-29字节
)
高级技巧:
- 相对位置(不用算具体位置):
( DEPTNO position(1:2),
DNAME position(*:16), ← 接着上一个字段结束的位置
LOC position(*:29) ← 继续接着
)
- 指定长度(更简单的方式):
( DEPTNO position(1) char(2), ← 从第1字节开始,长2字节
DNAME position(*) char(14), ← 接着上个字段,长14字节
LOC position(*) char(13) ← 继续接着,长13字节
)
优势: 处理速度最快,适合大数据量加载
日期数据加载——告别格式混乱
日期加载其实很简单,就像告诉SQLLDR:"请按这个格式理解日期"
控制文件写法:
(LAST_UPDATED date 'dd/mm/yyyy')
数据示例:
10,Sales,Virginia,1/5/2014
20,Accounting,Virginia,21/6/2014
结果: 所有日期都正确转换为Oracle日期格式
复杂情况: 如果输入文件包含多种日期格式,可以使用更强大的SQL函数来处理(下一篇会讲到)
实战总结
| 问题类型 | 解决方案 | 关键技巧 |
|---|---|---|
| 字段超长 | 添加char(长度) | DNAME char(1000) |
| CSV文件 | TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' | 引号保护包含逗号的文本 |
| 制表符分隔 | TERMINATED BY X'09' | 严格按制表符分割 |
| 跳过某些列 | 使用filler关键字 | dummy1 filler |
| 固定宽度 | 使用position定位 | position(1:2) 或 position(1) char(2) |
| 日期加载 | 指定日期格式 | date 'dd/mm/yyyy' |
记住这些技巧,SQLLDR数据加载就不再是难题!每种方法都有其适用场景,根据你的数据特点选择最合适的方式。
------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)
浙公网安备 33010602011771号