读书笔记: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字节
)

高级技巧:

  1. 相对位置(不用算具体位置):
( DEPTNO position(1:2),
  DNAME position(*:16),     ← 接着上一个字段结束的位置
  LOC position(*:29)        ← 继续接着
)
  1. 指定长度(更简单的方式):
( 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)

posted @ 2025-11-20 16:18  认真就输  阅读(0)  评论(0)    收藏  举报