关于External Table

本文介绍如何在Oracle数据库中创建和使用外部表,包括通过SQL*Loader和Data Pump两种方式加载和读取文件数据的方法。文章详细展示了创建外部表的SQL语句及注意事项。

实验环境

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

假设一文本文件d:/test.txt含有以下数据:
360,Jane,Janus,ST_CLERK,121,17-5-2001,3000,0,50,jjanus
361,Mark,Jasper,SA_REP,145,17-5-2001,8000,.1,80,mjasper
362,Brenda,Starr,AD_ASST,200,17-5-2001,5500,0,10,bstarr
363,Alex,Alda,AC_MGR,145,17-5-2001,9000,.15,80,aalda

创建Directory

SQL> create directory dir_test as 'd:/';

目录已创建。

1.创建sqlldr驱动的External Tables

默认情况下,oracle会采用sqlldr驱动的external table

SQL> CREATE TABLE test_ext
2 (employee_id NUMBER(4),
3 first_name VARCHAR2(20),
4 last_name VARCHAR2(25),
5 job_id VARCHAR2(10),
6 manager_id NUMBER(4),
7 hire_date DATE,
8 salary NUMBER(8,2),
9 commission_pct NUMBER(2,2),
10 department_id NUMBER(4),
11 email VARCHAR2(25)
12 )
13 ORGANIZATION EXTERNAL
14 (
15 TYPE ORACLE_LOADER
16 DEFAULT DIRECTORY dir_test
17 ACCESS PARAMETERS
18 (
19 records delimited by newline
20 badfile admin_bad_dir:'test.bad'
21 logfile admin_log_dir:'test.log'
22 fields terminated by ','
23 missing field values are null
24 ( employee_id, first_name, last_name, job_id, manager_id,
25 hire_date char date_format date mask "dd-mm-yyyy",
26 salary, commission_pct, department_id, email
27 )
28 )
29 LOCATION ('test.txt')
30 )
31 PARALLEL
32 REJECT LIMIT UNLIMITED;

表已创建。

SQL> select count(1) from test_ext;

COUNT(1)
----------
4

可以看到,已经可以从external table中查到数据。如果有问题,可以通过查看d:/test.log和d:/test.bad发现错误原因,已经未能进入external table的数据。如果要记录log和bad数据行,对对应的directiry需要有write权限。

上面建表语句中,允许使用并行来load数据,但是还需要在session或者system级允许并行
SQL> alter session enable parallel dml;

会话已更改。

2.利用ata pump驱动的external table导出数据到文件

data pump驱动的external需要基于data dump导出的文件,而不是普通的文本文件。同时使用data pump驱动的external可以将数据从数据库碇械汲龅轿募?/font>

SQL> CREATE TABLE test_ext2
2 ORGANIZATION EXTERNAL
3 (
4 TYPE oracle_datapump
5 DEFAULT DIRECTORY dir_test
6 LOCATION ('test.dump')
7 )
8 PARALLEL
9 as
10 select * from test_ext;

表已创建。

SQL> select count(1) from test_ext;

COUNT(1)
----------
4

注意d:/test.dmp文件不能已经存在,不然会报错
CREATE TABLE test_ext2
*
第 1 行出现错误:
ORA-29913: 执行 ODCIEXTTABLEOPEN 调出时出错
ORA-29400: 数据插件错误KUP-11012: 文件 test.dmp 已存在于 d:/ 中
ORA-06512: 在 "SYS.ORACLE_DATAPUMP", line 19

3.利用data pump驱动的external table读取dmp文件
SQL> CREATE TABLE test_ext3
2 (employee_id NUMBER(4),
3 first_name VARCHAR2(20),
4 last_name VARCHAR2(25),
5 job_id VARCHAR2(10),
6 manager_id NUMBER(4),
7 hire_date DATE,
8 salary NUMBER(8,2),
9 commission_pct NUMBER(2,2),
10 department_id NUMBER(4),
11 email VARCHAR2(25)
12 )
13 ORGANIZATION EXTERNAL
14 (
15 TYPE oracle_datapump
16 DEFAULT DIRECTORY dir_test
17 LOCATION ('test.dmp')
18 );

表已创建。

SQL> select count(1) from test_ext3;

COUNT(1)
----------
4
 

CREATE EXTERNAL TABLE 是用于创建外部表的语句。外部表是数据库中的一种特殊表类型,不实际存储数据,而是提供对存储在数据库外部的数据的访问接口,具备数据不存储在数据库中、可实时访问外部数据、可能只读或支持写操作等特点[^3]。 ### 语法规则 不同的数据库系统中,CREATE EXTERNAL TABLE 的语法会有所不同。以在 Hive 中读取 HBase 数据创建外部表为例: ```sql create external table sysexception( key string, IPAddr string, servername string, time string, source string, hostname string, dates string, fromhostIp string, loglevel string, msg string, syslogtag string ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES( "hbase.columns.mapping"= ":key, exceptionlog:IPAddr, exceptionlog:servername, exceptionlog:time, exceptionlog:source, exceptionlog:hostname, exceptionlog:date, exceptionlog:fromhostIp, exceptionlog:loglevel, exceptionlog:msg, exceptionlog:syslogtag" ) TBLPROPERTIES("hbase.table.name" = "sysexception"); ``` 在这个例子中,定义了表的列结构、存储处理程序、序列化反序列化属性以及表属性等信息[^4]。 ### 使用方法 - **创建引用不同数据源的外部表**:可以创建许多引用相同或不同外部数据源的外部表。例如在某些数据库系统中,可根据不同的数据源配置创建多个外部表指向不同的外部数据存储[^1]。 - **结合不同存储处理程序**:如在 Hive 中结合 HBase 存储处理程序(`org.apache.hadoop.hive.hbase.HBaseStorageHandler`)来创建指向 HBase 表的外部表,需要通过 `WITH SERDEPROPERTIES` 指定列映射关系,通过 `TBLPROPERTIES` 指定 HBase 表名等信息[^4]。 ### 应用场景 - **数据集成**:当需要将不同系统的数据进行整合分析时,可使用外部表来访问存储在不同系统中的数据,而无需将数据复制到数据库内部。 - **共享数据**:当数据被多个程序使用或修改时,使用外部表可以避免数据的重复存储,同时允许不同程序对数据进行操作。例如当 Table 的 data 部分被 Hive 以外的程序使用或者修改时,可创建外部表,在 Drop 表时希望 data 部分保留[^2]。 - **实时数据访问**:由于外部表在查询时会实时从外部系统读取数据,适合需要实时获取最新数据的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值