Oracle之外部表
Oracle之外部表
有时候,数据库海量数据的存储,是一个令人头疼的问题。别的不说,光是频繁的执行insert(1000次/秒)都是一场恶梦。但是,如果将数据保存到文家里,而不是数据库中,数据序列化的开销就小得多了。但是,对于文件的各种复杂检索,又是一件相当麻烦的事。
幸好,Oracle有这样一种特性,它可以将某些特定格式的文件映射到数据库中,形成一个“表”,称为“外部表”。单用户更改文件内容时,外部表中的数据即随之改变。同时,用户又可以像检索普通表一样,以只读的方式对外部表进行检索。
我们假设有这样一个文件(DATA.TXT):
1|this is a string
2|这里是个字符串
3|ABC
要把这样一个文件映射成外部表,有以下工作要做:
首先,我们需要为Oracle创建一个Directory,
创建方式为,在数据库中执行,须用DBA用户创建,并给应用授权。
create directory EXT_TABLE_DIR as'/home/oracle/app/oracle/oradata/php/'
注意“/home/oracle/app/oracle/oradata/php/”是一个存在于Oracle数据库服务器本身上边的实际存在的文件夹;
然后,将DATA.TXT文件拷贝到上述文件夹下;
最后,创建一个对应外部表,
create table EXT_TABLE_NAME
(
COL_1 NUMBER,
COL_2 VARCHAR2(512)
)
organization external
(
type oracle_loader
default directory EXT_TABLE_DIR
access parameters (fields terminated by '|' )
location ('DATA.TXT')
)
reject limit unlimited;
注意蓝色部分,EXT_TABLE_NAME是要映射成的外部表名称,EXT_TABLE_DIR是第一步里我们创建的Oracle的Directory,“|”是文件里的分割符,DATA.TXT是文件名。
需要补充的是,最后有一句“reject limit
unlimited”,告诉Oracle这个外部表没有行数限制。否则,当文件中的数据量超过200万行时,在对表进行检索时,就会出现ORA-30653,“reject
limit reached”错误。
Oracle 9i 的一项新特性就是 External
Table,它就象通常的数据库表一样,拥有字段和数据类型约束,并且可以查询,但是表中的数据却不存储在数据库中,而是在与数据库相关联的普通外部文件里。当你查询
External Table 时,Oracle 将解析该文件并返回符合条件的数据,就象该数据存储在数据库表中一样。
具体的定义可以参见《Oracle 概念手册》,以下的几点需要注意:
<一>:外部表的描述:
> 创建的语法类似于: "CREATE TABLE ... ORGANIZATION EXTERNAL"
> 数据在数据库的外部组织,是操作系统文件。
> 操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。
> 数据是只读的。(外部表相当于一个只读的虚表)
> 不可以在上面运行任何 DML 操作,不可以创建索引。
> 可以查询操作和连接。可以并行操作。
例子:
假如有如下两个数据文件:
1: 数据文件的格式
F1.TXT文件:
13234,FIRSTS
46464,TESTA
F2.TEXT文件:
13234,SECONDS
46464,TEST
2:创建目录,并用DBA进行授权;
sql> create directory test_dir as'E:temp';
sql>grant read,write on directorytest_dir to users;
注意:创建完毕逻辑目录之后要把平面文件拷贝到该目录下,另外还要注意文件名字不要写错。
一定要给oracle用户对这个目录可读可写的权限,操作系统层面,如使用chmod -R 777 test_dir;
3:使用被授权的用户users创建外部表:
create table test_table
(ms_no varchar(20),
tip varchar(20),
descs varchar(20))
ORGANIZATIONEXTERNAL
(
TYPEORACLE_LOADER
DEFAULTDIRECTORY test_dir
ACCESS Parameters
(
RECORDSDELIMITED BY NEWLINE
badfile 'bad_dev.txt'
LOGFILE 'log_dev.txt'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(ms_no,tip,descs)
)
LOCATION('F1.txt','F2.txt')
)
;
表创建完成.当然也可以导入一个文件
4:进行SELECT 操作看是否正确;
SQL>select * from test_table
结果如下:
MS_NO TIP DESCS
-------------------- ----------------------------------------
13234 FIRSTS
46464 TESTA
13234 SECONDS
46464 TEST
<二>: 如何得到外部表的有关信息:
SQL> DESCDBA_EXTERNAL_TABLES;
Name TypeNullable
----------------------- ------------- -----
OWNERVARCHAR2(30)
TABLE_NAMEVARCHAR2(30)
TYPE_OWNERCHAR(3) Y
TYPE_NAME VARCHAR2(30)
DEFAULT_DIRECTORY_OWNERCHAR(3) Y
DEFAULT_DIRECTORY_NAME VARCHAR2(30)
REJECT_LIMITVARCHAR2(40) Y
ACCESS_TYPEVARCHAR2(7) Y
ACCESS_PARAMETERS VARCHAR2(4000) Y
SQL>SELECTOWNER,TABLE_NAME,DEFAULT_DIRECTORY_NAME,ACCESS_PARAMETERSFRFROM
DBA_EXTERNAL_TABLES;
可以得到外部表的相关信息;
<三>:如何得到外部路径的信息:
SQL> desc DBA_EXTERNAL_LOCATIONS;
得到该表结构:
Name Type Nullable
--------------- -------------- --------
OWNERVARCHAR2(30)
TABLE_NAMEVARCHAR2(30)
LOCATIONVARCHAR2(4000) Y
DIRECTORY_OWNERCHAR(3) Y
DIRECTORY_NAME VARCHAR2(30) Y
SQL> select * fromDBA_EXTERNAL_LOCATIONS;
得到具体信息
外部表的含义:
外部表使用限制:(来源于http://www.examda.com/oracle/zonghe/20101031/141746967.html)
对于操作系统文件的限制:
另外在外部表格中,不能够带有标题信息。如现在有一张表格,以逗号分隔。而在其第一列数据中有各个列的标题信息。而数据库系统在连接这个表的时 候,会将这些标题信息当作普通的纪录来对待。即会将这些信息也显示在外部表中。为此如果这个标题信息与外部表的字段类型不一致(如字段内容是number 数据类型,而标题信息则是字符型数据,则在查询时就会出错)。如果数据类型恰巧一致的话,这个标题信息Oracle数据库也会当作普通记录来对待。如在建 立外部表的时候,最好确认一下操作系统文件中是否包含标题信息。如果有的话,需要删除。否则的话,可能会出错。
最后需要说明的是,当Oracle数据库系统访问这个操作系统文件的时候,会在这个文件所在的目录自动创建一个日志文件。无论最后是否访问成功,这个日志文件都会如期建立。查看这个日志文件,可以了解数据库访问外部表的频率、是否成功访问等等。
其次,这个外部表毕竟与内部表不同。在创建外部表的时候,其实在数据库中跟本没有创建表。也就是说,不会为外部表分配任何的存储空间。创建外部 表只是在数据字典中创建了外部表的元数据,以便对应访问外部表中的数据,而不在数据库中存储外部表的数据。简单地说,数据库存储的只是与外部文件的一种对 应关系,如字段与字段的对应关系。而没有存储实际的数据。为此在表的操作与管理上,就会受到很大的限制。如在外部表上,是不能够为表创建索引。因为创建索 引就意味着要存在对应的索引记录。而外部表其实在数据库不会有存储。故在外部中是无法建立索引的。如果硬要建立的话,则系统会提示“操作在外部组织表上不 受支持”的错误提示。同样的道理,在数据库中也不能够更新外部表中的数据,如插入记录、删除记录或者更新信息等等。简而言之,这个外部表对于数据库来说, 是只读的,不可更新。
要了解这个信息,则可以通过查询dba_external_locations。通过查询这张表,系统会反映当前所有的目录对象以及相关的外部 表,还会查询出这些外部表所对应的操作系统文件的名字。先查询这张表格,确定要删除的对象没有其他关联的外部表时,再进行删除。否则的话,需要先确认其他 外部表的可用性。免得因为误删除而导致外部表无法正常使用。
Oracle之外部表相关推荐
- Oracle的外部表
一.外部表特性 数据文件位于操作系统之外,并且具有一定的格式分割的文本文件或其他类型文件.ORACLE的外部表通过SQL的形式访问数据文件中的数据,数据并不需要加载到数据库中且数据是可读的,所以不用D ...
- 如何使用Oracle的外部表查询警告日志文件
从Oracle9i版本开始,Oracle的外部表技术(Oracle External Tables)有了很大的增强,通过外部表访问外部数据增强了Oracle数据库和外部数据源进行数据交互能力,对于数据 ...
- oracle把中文转换为拼音,怎样将“Oracle”的外部表汉字转换为拼音
怎样将"Oracle"的外部表汉字转换为拼音 2008-03-07 eNet&Ciweek 我在原来的应用中使用代码表加一个函数来处理汉字转拼音的转换问题,现在由于工作需要 ...
- 外表加载oracle,opengauss外部表插件——oracle_fdw
oracle_fdw oracle_fdw是一款开源插件,github地址: https://github.com/laurenz/oracle_fdw .openGauss基于开源的 oracle_ ...
- 外部表如何导入mysql_如何利用Oracle外部表导入文本文件的数据
Oracle外部表支持两种类型的驱动:一种是ORACLE_LOADER,外部表的数据必须来源于文件文件,另一种则是ORACLE_DATAPUMP,外部表的 同事最近在忙数据一致性比对工作,需要对不同文 ...
- [原]Oracle外部表结合游标完成统计一例
近日在邮件系统进行迁移的过程中遇到一个问题,我用Oracle的外部表结合游标将其解决,特记于此文. 问题是这样的,通过开发商的程序,得到一个操作文件 delete_file ,该文件记录了一些操作不步 ...
- datapumpdir oracle_oracle_datapump创建外部表案例
一.datapump创建外部表,数据来源于内部实体表 --首先创建 scott.countries实体表,用于做实验 SQLgt; create table scott.cou 一.datapump创 ...
- oracle外部表使用详解,详解Oracle外部表的一次维护(图文)
在做Oracle数据库的导出导入操作的时候,发现在将导出数据导入到新库过程中报告如下错误: 在查看数据库中关于外部表的视图中相关信息:select * from dba_directoriesSele ...
- oracle 外部表及解决ora-29400,ora-29913错误
对外部表的理解及测试,,,,如有理解不正确请大家指正 语法: create table 表名( 列名1,列名2,...... ) organization external ###说明创建外部表 ( ...
最新文章
- sql leftjoin from a,b区别
- editplus 常用快捷键汇总 大小写代码折叠
- 正则表达式简明使用手册
- 无向图:查找最小环集合(最短路径回溯算法)
- python异步和多线程_Python 异步 IO(asyncio)、多进程、多线程性能对比
- AMD发布APPML源码,构建clMath库
- layui获得列表json数据_golang实战开发之博客功能篇:文章列表的读取与展示和分类筛选展示处理...
- 通过组策略集中管理管理用户桌面和开始菜单
- (C/C++) Link List - C 語言版本
- jacob word另存为
- SQL SERVER某用户看不到‘Sql Server代理'
- 漫步STL-string in [Cpp] v.s. String in [Java]
- python k线斜率计算公式_浅析K线上涨斜率
- flv网页播放器开源代码
- Unity5入门及进阶项目实战 星际迷航-肖师军-专题视频课程
- 真香!一行代码搞定微信支付回调
- 通过Eclipse创建一个Project ,Java Project 和Tomcat Project 生成的目录和文件
- 避雷:六种职场着装可能导致你面试失败
- 用户登录 默认 计算机 用户文件,guest登录系统默认禁止guest访问本地计算机(组图)...
- MBR、EBR、DBR
热门文章
- 树形结构:优先级队列,堆
- Prthon编码和解码/is 和 ==
- 性能测试入门(六)windows及Linux下做压力测试的注册表设置
- How to determine what causes a particular wait type
- [Debug]IOS微信浏览器不支持form表单的target=_blank
- Bootstrap简介及Bootstrap里的栅格系统col-md/sm/xs-x;
- Linux MySQL5.5的安装
- C++手动实现库函数
- 通过实现继承TabActivity并且实现TabContentFactory的方法创建选项卡的一点心得
- apache站点优化——长连接