暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【每日一练 075】数据移动:外部表

原创 李美静 恩墨学院 2020-11-09
1743

1外部表的架构

外部表是将操作系统中的文件在数据库中以只读的表形式展现出来。
image.png
外部表访问外部数据源中的数据,就像访问数据库中的表一样。可以使用DDL连接到数据库并为外部表创建元数据。外部表的DDL由两部分组成:一部分描述Oracle数据库列类型,另一部分描述外部数据到Oracle数据库数据列的映射。
外部表不描述存储在数据库中的任何数据。它也没有描述数据是如何存储在外部来源。相反,它描述了外部表层必须如何将数据呈现给服务器。访问驱动程序和外部表层负责对外部文件中的数据进行必要的转换,以便它与外部表定义匹配。外部表是只读的;因此,DML操作是不可能的,而且不能在这些操作上创建索引。
外部表使用了两个访问驱动程序。ORACLE_LOADER访问驱动程序只能用于从外部表读取表数据并将其加载到数据库中。它使用文本文件作为数据源。ORACLE_DATAPUMP访问驱动程序既可以从外部文件加载表数据到数据库中,也可以从数据库卸载数据到外部文件中。它使用二进制文件作为外部文件。二进制文件与数据泵导入和导出实用程序使用的文件具有相同的格式,并且可以与它们互换。

2 外部表的使用要点

为外部表创建的数据文件可以移动,并作为同一数据库或不同数据库中的另一个外部表的数据文件使用。外部数据可以与驻留在数据库中的表并行地直接查询和联接,而不需要首先加载数据。可以选择让应用程序使用SELECT命令直接访问外部表,也可以选择先将数据加载到目标数据库中。
可以使用ORACLE_DATAPUMP访问驱动程序将复杂查询的结果卸载到外部文件。
由不同外部表填充的数据文件都可以在另一个外部表的LOCATION子句中指定。这提供了一种从多个源聚合数据的简单方法。唯一的限制是所有外部表的元数据必须完全相同。

3 示例

使用ORACLE_LOADER

CREATE TABLE extab_employees
                  (employee_id       NUMBER(4), 
                   first_name        VARCHAR2(20),
		 last_name         VARCHAR2(25),
 		hire_date         DATE)
 ORGANIZATION EXTERNAL 
     ( TYPE ORACLE_LOADER DEFAULT DIRECTORY extab_dat_dir 
       ACCESS PARAMETERS 
       ( records delimited by newline 
         badfile extab_bad_dir:'empxt%a_%p.bad' 
         logfile extab_log_dir:'empxt%a_%p.log' 
         fields terminated by ',' 
         missing field values are null 
     ( employee_id, first_name, last_name, 
			hire_date char date_format date mask "dd-mon-yyyy“)) 
     LOCATION ('empxt1.dat', 'empxt2.dat') ) 
     PARALLEL  REJECT LIMIT UNLIMITED; 

说明:
外部表的元数据是使用数据库中的SQL语言创建的。ORACLE_LOADER访问驱动程序使用SQLLoader语法定义外部表。此命令不创建外部文本文件。
示例展示了三个目录对象(EXTAB_DAT_DIR、EXTAB_BAD_DIR和EXTAB_LOG_DIR),它们被创建并映射到现有的操作系统目录,用户可以访问这些目录。
当访问EXTAB_EMPLOYEES表时,使用SQL
Loader功能来加载表,并在该实例中创建日志文件和坏文件。
最佳实践提示:如果你有很多数据要加载,启用并行加载操作:启用并行DML;
使用ORACLE_DATAPUMP

CREATE TABLE ext_emp_query_results
  (first_name, last_name, department_name)
ORGANIZATION EXTERNAL
  (
    TYPE ORACLE_DATAPUMP
    DEFAULT DIRECTORY ext_dir
    LOCATION ('emp1.exp','emp2.exp','emp3.exp')
  )
PARALLEL
AS
SELECT e.first_name,e.last_name,d.department_name
FROM   employees e, departments d
WHERE  e.department_id = d.department_id AND
       d.department_name in
                     ('Marketing', 'Purchasing');

说明:这个示例展示了外部表填充操作如何帮助导出一组可选的记录,这些记录是由连接EMPLOYEES和DEPARTMENTS表产生的。
因为外部表可能很大,所以可以使用并行填充操作将数据卸载到外部表。与来自外部表的并行查询不同,并行填充操作的并行度受到访问驱动程序可以写入的并发文件数量的限制。在特定的时间点,不会有超过一个并行执行服务器写入一个文件。
LOCATION子句中的文件数量必须与指定的并行度匹配,因为每个输入/输出(I/O)服务器进程都需要自己的文件。任何指定的额外文件都将被忽略。如果没有足够的文件满足指定的并行度,则降低并行度以匹配LOCATION子句中的文件数量。
在填充之后,外部表是只读的。SELECT命令可能非常复杂,它允许在外部表中填充特定的信息。外部表具有与二进制数据泵文件相同的文件结构,可以迁移到另一个系统,用impdp实用程序导入或作为外部表读取。

4 外部表的使用

示例一:SQL> SELECT * FROM extab_employees;
示例二:SQL> SELECT e.employee_id, e.first_name, e.last_name, d.department_name FROM departments d, extab_employees e
WHERE d.department_id = e.department_id;
示例三:SQL> INSERT /*+ APPEND */ INTO hr.employees SELECT * FROM extab_employees;
查询外部表就像查询内部数据库表一样。第一个示例演示了查询名为EXTAB_EMPLOYEES的外部表,并只显示结果。结果不存储在数据库中。
第二个示例显示了一个名为DEPARTMENTS的内部表与一个名为EXTAB_EMPLOYEES的外部表的连接,并只显示结果。
的第三个例子演示了如何通过查询和加载外部表中的数据直接追加到内部表数据。

5 相关的数据字典

[DBA| ALL| USER]_EXTERNAL_TABLES
[DBA| ALL| USER]_EXTERNAL_LOCATIONS
[DBA| ALL| USER]_TABLES
[DBA| ALL| USER]_TAB_COLUMNS
[DBA| ALL]_DIRECTORIES

最后修改时间:2020-11-09 10:00:01
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论