2010年12月28日
oracle外部表
外部表的含义:
外部表使用限制:(来源于http://www.examda.com/oracle/zonghe/20101031/141746967.html)
对于操作系统文件的限制:
另外在外部表格中,不能够带有标题信息。如现在有一张表格,以逗号分隔。而在其第一列数据中有各个列的标题信息。而数据库系统在连接这个表的时 候,会将这些标题信息当作普通的纪录来对待。即会将这些信息也显示在外部表中。为此如果这个标题信息与外部表的字段类型不一致(如字段内容是number 数据类型,而标题信息则是字符型数据,则在查询时就会出错)。如果数据类型恰巧一致的话,这个标题信息Oracle数据库也会当作普通记录来对待。如在建 立外部表的时候,最好确认一下操作系统文件中是否包含标题信息。如果有的话,需要删除。否则的话,可能会出错。
最后需要说明的是,当Oracle数据库系统访问这个操作系统文件的时候,会在这个文件所在的目录自动创建一个日志文件。无论最后是否访问成功,这个日志文件都会如期建立。查看这个日志文件,可以了解数据库访问外部表的频率、是否成功访问等等。
其次,这个外部表毕竟与内部表不同。在创建外部表的时候,其实在数据库中跟本没有创建表。也就是说,不会为外部表分配任何的存储空间。创建外部 表只是在数据字典中创建了外部表的元数据,以便对应访问外部表中的数据,而不在数据库中存储外部表的数据。简单地说,数据库存储的只是与外部文件的一种对 应关系,如字段与字段的对应关系。而没有存储实际的数据。为此在表的操作与管理上,就会受到很大的限制。如在外部表上,是不能够为表创建索引。因为创建索 引就意味着要存在对应的索引记录。而外部表其实在数据库不会有存储。故在外部中是无法建立索引的。如果硬要建立的话,则系统会提示“操作在外部组织表上不 受支持”的错误提示。同样的道理,在数据库中也不能够更新外部表中的数据,如插入记录、删除记录或者更新信息等等。简而言之,这个外部表对于数据库来说, 是只读的,不可更新。
要了解这个信息,则可以通过查询dba_external_locations。通过查询这张表,系统会反映当前所有的目录对象以及相关的外部 表,还会查询出这些外部表所对应的操作系统文件的名字。先查询这张表格,确定要删除的对象没有其他关联的外部表时,再进行删除。否则的话,需要先确认其他 外部表的可用性。免得因为误删除而导致外部表无法正常使用。
--通过外部表查找数据库的运行信息
lag函数语法:lag(字段,n)
lead函数语法与lag一样。
--更改拒绝限制
ALTER TABLE alert_fgisdb LIMIT 100;--更改默认目录说明ALTER TABLE alert_fgisdb DIRECTORY DEFAULT DIRECTORY bdump;--修改访问参数,如分隔符由","变为"|"ALTER TABLE alert_fgisdb PARAMETERS ACCESS PARAMETERS (FIELDS TERMINATED BY '|');--修改文件位置:ALTER TABLE alert_fgisdb LOCATION('TC_REG_MNGREGIONCODE.txt'); drop table alert_fgisdb;--删除目录drop DIRECTORY bdump;--查询外部表(找出alert中含有ora的所有记录)select * from alert_fgisdb where text like 'ORA-%';
--准备一个简单的select语句向这个目录中卸载数据 create table all_objects_unload organization external (type oracle_datapump default directory dir_dp location('allobjects.dat')) --allobjects.dat文件在dir_dp目录下 as select * from all_objects --将allobjects.dat文件拷到要加载该表的机器,使用如下语句抽取DDL重建这个表 select dbms_metadata.get_ddl('TABLE','ALL_OBJECTS_UNLOAD') from dual; --抽取后的DDL语句如下: CREATE TABLE "GWM"."ALL_OBJECTS_UNLOAD" ( "OWNER" VARCHAR2(30), "OBJECT_NAME" VARCHAR2(30), "SUBOBJECT_NAME" VARCHAR2(30), "OBJECT_ID" NUMBER, "DATA_OBJECT_ID" NUMBER, "OBJECT_TYPE" VARCHAR2(19), "CREATED" DATE, "LAST_DDL_TIME" DATE, "TIMESTAMP" VARCHAR2(19), "STATUS" VARCHAR2(7), "TEMPORARY" VARCHAR2(1), "GENERATED" VARCHAR2(1), "SECONDARY" VARCHAR2(1) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY "DIR_DP" LOCATION ( 'allobjects.dat' ) ) --重建该表后,执行如下语句就可以加载这个表的信息 insert /*+ append */ into some_table select * from all_objects_unload;