由于身体等因素,已经好几天没有针对OCA练习中的盲点进行单独学习了
今天就按之前计划,对两个Oracle数据加载功能进行一定的了解
SQL*Loader,可以通过外部数据文件获取数据,并传送到Oracle的表中
它可以通过网络获取数据,从多个文件中获取数据,将获取的数据传入多个表
指定数据字符集,有选择性的获取数据,在读取数据前对数据进行操作
从磁盘、磁带、命名管道获取数据,利用操作系统的文件系统访问数据文件
产生错误报告以便进行问题解决,读取LOB或集合数据
使用高度灵活的传统读取方式或高性能拿的直接路径读取方式获取数据
这些是它的主要特点,在今后实际应用中,应该还会发现其它大大小小的好处
SQL*Loader并不是在SqlPlus环境中调用的(可被前台程序调用)
而是一个单独发行的小工具软件,一般位于$ORACLE_HOME/bin/目录下
在个人的RH AS 4下,直接输入sqlldr可以显示一些简单帮助
命令使用的格式:SQLLDR keyword=value
keyword是参数关键字,value是参数值
SQL*Loader调用时,可以带有control参数并指定一个control文件
此文件可以用来管理SQL*Loader的获取数据、解析数据、导入数据等操作的方式
文件可以分三个部分
第一部分,指定session的范围,比如指定行、列,输入数据文件位置,读取的数据等
第二部分,指定输出的表等相关信息
第三部分,可选部分,要导入的数据
对于数据文件中记录的解析,可以有固定、可变、流三种方式
解析的记录作为物理记录,一般一个物理记录就是一个逻辑记录
也可以由多个物理记录组成一个逻辑记录
另外也可指定记录中每个字段的类型
可以通过指定bad文件,用来记录被SQL*Loader或Oracle拒绝接受的数据记录
比如,当输入数据的格式不正确,或不符合数据数据insert规则的数据
而discard文件用来保存那些没有通过控制文件中设定的接受规则的记录
另外,SQL*Loader在执行时候,会创建一个log日志,记录整个运行过程中的状况
SQL*Loader有三种读取数据的方式
conventional path load,数据文件按指定标准进行解析,并记录到相应的bind array
当bind array满了或全部数据已经记录到bind array中,array insert开始执行
direct path load,会将记录字段数据转化为相应列类型并存放于列数组column array
再被格式化为Oracle数据块格式,直接写到数据库中
另外,Oracle提供direct path load API来帮助用户开发相关程序功能
external table load,没想到外部表是从属于SQL*Loader的……
两者有各自更适合的应用场合
如果偏向并行传输,并对数据进行一定的转换,可以考虑外部表
而远程获取数据,不需要对数据进行什么转换,可以考虑SQL*Loader
外部表是通过SQL语句在create table时候建立的(ORGANIZATION EXTERNAL子句)
使用外部表,需要建立一个DIRECTORY数据库对象,并给相应用户设置权限
还可通过设置access parameter来规定access driver的默认行为
access driver有两种语法规则,ORACLE_LOADER和ORACLE_DATADUMP
做个简单的外部表练习
CREATE OR REPLACE DIRECTORY ext_tab_dir AS '/home/oracle/oracle/oradata/test/';
GRANT READ ON DIRECTORY ext_tab_dir TO SCOTT;
在ext_tab_dir下放一个info.dat文件,里面有如下信息
56november, 15, 1980 baker mary alice 09/01/2004
87december, 20, 1970 roper lisa marie 01/01/1999
创建外部表
CREATE TABLE emp_load
(employee_number CHAR(5),
employee_dob CHAR(20),
employee_last_name CHAR(20),
employee_first_name CHAR(15),
employee_middle_name CHAR(15),
employee_hire_date DATE)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_tab_dir
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
FIELDS (employee_number CHAR(2),
employee_dob CHAR(20),
employee_last_name CHAR(18),
employee_first_name CHAR(11),
employee_middle_name CHAR(11),
employee_hire_date CHAR(10) date_format DATE mask "mm/dd/yyyy"
)
)
LOCATION ('info.dat')
);
然后就可以利用select * from emp_load;
查看到从外部文件读取过来的两条记录了
另外也简单练习一下SQL*Loader
利用Office的Excel建立一个CSV文件,内容如下
|
1 |
RICOH |
97:27:00 |
74:12:00 |
|
2 |
MCC |
97:34:22 |
74:43:00 |
|
3 |
MCC |
97:34:22 |
79:59:74 |
|
4 |
SONY |
97:26:51 |
79:59:74 |
|
5 |
RITEK |
97:10:00 |
79:59:74 |
|
6 |
RITEK |
97:27:10 |
74:41:00 |
拷到VM的RH AS4的/home/oracle/oracle/oradata/test/目录下
在测试数据库中建立表
CREATE TABLE "SCOTT"."T_SL"
( "THEID" NUMBER NOT NULL ENABLE,
"THENAME" NVARCHAR2(10),
"THEPAR1" VARCHAR2(8 BYTE),
"THEPAR2" VARCHAR2(10 BYTE)
) NOLOGGING;
建立一个control文件,test.ctl,内容如下
LOAD DATA
INFILE '/home/oracle/oracle/oradata/test/test2.csv'
INSERT INTO TABLE t_sl
FIELDS TERMINATED BY ","
(THEID,THENAME,THEPAR1,THEPAR2)
在操作系统提示符下,执行命令 sqlldr userid=scott/scott@test control=test.ctl
执行完毕后,就可通过 select * from T_SL;
查看到刚刚通过SQL*Loader导入的记录了
同时,工具自动生成了一个test.log文件,记录了整个过程的大致摘要
利用SQL*Loader和它的外部表功能,可以灵活实现多种数据源的加载
虽然题目是深入了解,其实也不过是先对概念、应用有个大致上的体验罢了
还有很多可以继续深入的地方
但目前先以把Oracle各个基础知识了解一二为主要目标,还有不少东西等着看呢
有关SQL*Loader和外部表的更多学习,放在以后找时间来弄吧~
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/556359/viewspace-526430/ ,如需转载,请注明出处,否则将追究法律责任。