SQL*Loader工具是Oracle非常强大的外部数据加载工具。这篇文章将简单讨论一下SQL*Loader工具的结构,配置以及突出特性。
下面是一张SQL*Loader工具的结构图:
![bb](http://img.blog.itpub.net/blog/attachments/2013/06/23135684_201306061645451.gif?x-oss-process=style/bb)
上图中描述了SQL*Loader工作使用的物理文件,包括输入的文本文件,输出的数据库;SQL*Loader工具工作需要至少一个控制文件,控制文件中包含了数据加载的描述性信息,SQL*Loader根据控制文件中的描述来加载、转换数据,写入数据库。控制文件中除了包含数据加载的描述性信息外,还可以包含参数信息和加载的数据。参数信息包括,直接路径加载参数等,可以通过sqlldr工具的parfile参数指定单独的配置文件,这里需要注意的是,在sqlldr命令行指定的参数将覆盖在控制文件中指定的参数。单独的数据文件是通过控制文件中的INFILE属性指定的。
SQL*Loader工具运行后会产生3个文件,一个是日志文件,日志文件中详细记录了数据的加载情况和加载结果,并会另外指定两个文件Bad FIles和Discard Files,Bad Files保存的是加载导致SQL错误(也就是说,输入数据是“坏的”)的数据,Discard Files保存的是加载过程抛弃的数据。加载完毕对这些文件的验证能够了解加载情况,判断加载是否成功。
SQL*Loader支持传统路径和直接路径加载,传统路径加载SQL*Loader工具会将数据转换成SQL语句执行,会产生相应的undo和redo数据,直接路径加载是直接操作数据块,不会产生相应的undo和redo数据,特别适合大数据量的加载工作。
通过上面的讨论可以了解到SQL*Loader工具最核心的是控制文件,控制文件中最核心的配置是对加载数据的定义。下面通过一个简单的例子讨论控制文件中的配置:
/***************************************/
Load DATA
#表示加载数据。
INFILE 'C:\sqlldr\olap.date_time_15_min.txt'
#INFILE指定数据文件,如果是INFILE *,表示加载的数据保存在控制文件中。
INTO TABLE test.date_time_15_min
#数据加载到的具体表名。
APPEND|REPLACE|TRUNCATE
#如果没有这行,默认是INSERT操作,要求表必须为空,TRUNCATE操作非传统意义上的TRUNCATE TABLE DATE_TIME_15_MIN,而是执行TRUNCATE TABLE DATE_TIME_15_MIN REUSE STORAGE操作,这点需要注意。
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
#数据的存储是以,符号作为分割,"符号引起来的表示字符串,这是定界加载,这是最传统的方式,另外还可以定长加载,这里我们不讨论。
TRAILING NULLCOLS
#如果输入的数据不存在某列的数据,SQLLOADER就会为该列绑定一个NULL值。
(APPLIEDTIME "to_date(:appliedtime,'yyyy-mm-dd hh24:mi:ss')",
#以(符号开始表示表的字段,由于是日期字段,所以需要使用函数进行转换,函数必须用双引号引起来,:appliedtime是跟前面的APPLIEDTIME相对应。
/***************************************/
Load DATA
#表示加载数据。
INFILE 'C:\sqlldr\olap.date_time_15_min.txt'
#INFILE指定数据文件,如果是INFILE *,表示加载的数据保存在控制文件中。
INTO TABLE test.date_time_15_min
#数据加载到的具体表名。
APPEND|REPLACE|TRUNCATE
#如果没有这行,默认是INSERT操作,要求表必须为空,TRUNCATE操作非传统意义上的TRUNCATE TABLE DATE_TIME_15_MIN,而是执行TRUNCATE TABLE DATE_TIME_15_MIN REUSE STORAGE操作,这点需要注意。
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
#数据的存储是以,符号作为分割,"符号引起来的表示字符串,这是定界加载,这是最传统的方式,另外还可以定长加载,这里我们不讨论。
TRAILING NULLCOLS
#如果输入的数据不存在某列的数据,SQLLOADER就会为该列绑定一个NULL值。
(APPLIEDTIME "to_date(:appliedtime,'yyyy-mm-dd hh24:mi:ss')",
#以(符号开始表示表的字段,由于是日期字段,所以需要使用函数进行转换,函数必须用双引号引起来,:appliedtime是跟前面的APPLIEDTIME相对应。
applieddate "to_date(:applieddate,'yyyy-mm-dd hh24:mi:ss')",
psvcode,
#如果字段没有指定存储类型,默认为CHAR(255),超过长度会收到Fileld in data file exceeds maximum length的报错,只需要根据长度指定类型,例如,CHAR(1000)。
#如果字段没有指定存储类型,默认为CHAR(255),超过长度会收到Fileld in data file exceeds maximum length的报错,只需要根据长度指定类型,例如,CHAR(1000)。
hzpsvcode,
pointindex,
appliedhour "to_date(:appliedhour,'yyyy-mm-dd hh24:mi:ss')"
)
BEGINDATA
#下面是加载的数据,对应上面的INFILE *设置。
BEGINDATA
#下面是加载的数据,对应上面的INFILE *设置。
........
/***************************************/
控制文件除了定义数据加载方式外,还可以保存SQLLOADER参数和加载的数据。
另外,从Oracle 9i开始,Oracle推出了外部表的功能,外部表是另一种快速加载数据的方式,沿用了SQL*Loader的参数,用于替代SQL*Loader工具,它比SQL*Loader工具有更好的灵活性,能够更灵活的处理、筛选数据(SQL语句方面),调度数据的加载,学习的知识也相对更少。
从Oracle Database 10g开始,Oracle推出外部表卸载功能ORACLE_DATAPUMP能够非常方便的将数据卸载到平面文件,通过平面文件的传递可以快速加载到其他数据库。Oracle没有提供专门工具用于将数据库的数据卸载到平面文件中,可以用SQL语句、外部表卸载功能、PL/SQL等等方式完成数据的卸载。
参考文档:
《Oracle Database 9i/10g/11g编程艺术深入数据库体系结构(第2版)》第15章。
《Oracle Database Utilities 10g Release 2 (10.2)》: http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm#g1013706
--end--
另外,从Oracle 9i开始,Oracle推出了外部表的功能,外部表是另一种快速加载数据的方式,沿用了SQL*Loader的参数,用于替代SQL*Loader工具,它比SQL*Loader工具有更好的灵活性,能够更灵活的处理、筛选数据(SQL语句方面),调度数据的加载,学习的知识也相对更少。
从Oracle Database 10g开始,Oracle推出外部表卸载功能ORACLE_DATAPUMP能够非常方便的将数据卸载到平面文件,通过平面文件的传递可以快速加载到其他数据库。Oracle没有提供专门工具用于将数据库的数据卸载到平面文件中,可以用SQL语句、外部表卸载功能、PL/SQL等等方式完成数据的卸载。
参考文档:
《Oracle Database 9i/10g/11g编程艺术深入数据库体系结构(第2版)》第15章。
《Oracle Database Utilities 10g Release 2 (10.2)》: http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm#g1013706
--end--
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23135684/viewspace-763296/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23135684/viewspace-763296/