1.介绍
外部表只能在Oracle 9i之后来使用。简单地说,外部表,是指不存在于数据库中的表。通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储在一个普通数据库表中一样来进行访问。外部表是对数据库表的延伸。
2.特性
(1) 位于文件系统之中,按一定格式分割,如文本文件或者其他类型的表可以作为外部表。
(2) 对外部表的访问可以通过SQL语句来完成,而不需要先将外部表中的数据装载进数据库中。
(3) 外部数据表都是只读的,因此在外部表不能够执行DML操作,也不能创建索引。
(4) ANALYZE语句不支持采集外部表的统计数据,应该使用DMBS_STATS包来采集外部表的统计数据。
(5) 可以查询操作和连接。可以并行操作。
(6) 数据在数据库的外部组织,是操作系统文件。
(7) 操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。
3.oracle外部表类型
Oracle 提供两种访问驱动 :ORACLE_LOADER 和ORACLE_DATAPUMP(oracle 10.2 后新增的驱动 )
ORACLE_LOADER : 它利用 oracle loader 技术从外部表读取数据 . 它还具有类似 SQL*Loader 工具控制文件语法的数据映射能力 .
ORACLE_DATAPUMP :它提供卸载数据的能力 , 即把数据从数据库里导入一个外部表 , 再由一个或几个外部表导入到数据库里 .
对于 ASsubquery 的子句必须使用 ORACLE_DATAPUMP . 创建用于卸载数据的外部表时,不能制定列名。
同时,不支持 badfile 、 discardfile 参数,因为其无效或者丢弃数据将不予以记录为操作系统文件 , 没有 fields erminated by
( 或者 missing field values are null) 参数。ORACLE_DATAPUMP 一般使用在进行日志表等大数据表的备份和数据转移上 .
唯一不足的是 Oracle 只能将数据写成二进制格式 , 所以用外部表来生成 Excel 报表之类的是行不通的 . 不过在 web 应用中用外部表加载 Excel 数据却是可以的而且很 大程度上提高应用的性能 , 后面会进行相关举例 . 。。。。
4.举例
(备份表数据到平面文件): CREATE TABLE external_dkey_test (
my_id,
user_id,
object_type,
my_sequence
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY dkey_dir
LOCATION('external_dkey_test .dmp')
)
AS SELECT my_id,user_id,object_type,my_sequenceFROM dkey_objects;
查看平面文件可以用strings
$strings external_dkey_test .dmp
如果此时另一个库需要此份数据,则可以再通过外部表进行加载处理步骤:
1.在数据库服务器上建个文件夹存放平面文件,假如路径如下:
/data/
2.创建一个外部表加载路径
create or replace directory temp_dir as '/data/';
3.进行加载数据生成外部表
create table external_dkey_test (
my_id number(11),
user_id number(11),
object_type number(30),
my_sequence varchar2(30)
)
organization external (
type oracle_loader
default directory dkey_dir
access parameters (fields terminated by ',' )
location ('external_dkey_test .dmp')
);
4.从外部表提取数据到正式表
使用: insert into
insert into external_dkey_test _log as select * from external_dkey_test ;
可以使用外部表加载Excel表格到数据中,而且性能效率很高,比web应用中使用poi上传处理上传的Excel数据要快很多.
特别是大批量数据上传时.
加载Excel数据步骤 :
1.将Excel转换成csv的逗号相隔的文件格式
2.同上面对加载语句只要将external_dx_sms_bak0127.DMP改成'external_dx_sms_bak0127.csv
做测试时加载成功后进行查询时出现ORA-29913 ORA-06512错误,经查询发现是由于在创建时定义的列的宽度太小或者文件路径
不正确导致. 、
另外:
--使用datapump创建外部表,且数据来源于外部文件dmp