Oracle 数据库外部表详解

Oracle 数据库外部表详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

外部表允许查询文件数据[1]:

详细见:Oracle 数据库外部表


2. ORACLE_LOADER

2.1 目录

CREATE DIRECTORY data_dir AS '/u01/data';
CREATE DIRECTORY log_dir AS '/u01/log';
GRANT READ, WRITE ON DIRECTORY data_dir TO scott;
GRANT READ, WRITE ON DIRECTORY log_dir TO scott;

2.2 创建

CREATE TABLE ext_sales (
  id NUMBER,
  sale_date DATE,
  amount NUMBER,
  region VARCHAR2(50)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY data_dir
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    BADFILE log_dir:'sales.bad'
    LOGFILE log_dir:'sales.log'
    DISCARDFILE log_dir:'sales.dsc'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    MISSING FIELD VALUES ARE NULL
    (
      id CHAR,
      sale_date CHAR DATE_FORMAT DATE MASK 'YYYY-MM-DD',
      amount CHAR,
      region CHAR
    )
  )
  LOCATION ('sales_2025.csv')
)
REJECT LIMIT UNLIMITED
PARALLEL 4;

2.3 多文件

LOCATION ('sales_2025_01.csv', 'sales_2025_02.csv', 'sales_2025_03.csv')

2.4 查询

SELECT * FROM ext_sales;
SELECT * FROM ext_sales WHERE region = 'East';

-- 加载
INSERT /*+ APPEND */ INTO sales SELECT * FROM ext_sales;

3. ORACLE_DATAPUMP

3.1 导出

CREATE TABLE exp_sales
ORGANIZATION EXTERNAL (
  TYPE ORACLE_DATAPUMP
  DEFAULT DIRECTORY data_dir
  LOCATION ('sales.dmp')
)
AS SELECT * FROM sales;

-- 生成 sales.dmp 文件

3.2 导入

-- 在另一数据库
CREATE TABLE imp_sales (
  id NUMBER,
  sale_date DATE,
  amount NUMBER,
  region VARCHAR2(50)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_DATAPUMP
  DEFAULT DIRECTORY data_dir
  LOCATION ('sales.dmp')
);

SELECT * FROM imp_sales;

4. ORACLE_HDFS(Big Data SQL)

CREATE TABLE hdfs_sales (
  id NUMBER,
  amount NUMBER
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_HDFS
  DEFAULT DIRECTORY hdfs_dir
  ACCESS PARAMETERS (
    com.oracle.bigdata.colmap: ...
    com.oracle.bigdata.overflow: ...
  )
  LOCATION ('/data/sales/*')
);

5. ORACLE_HIVE(Big Data SQL)

CREATE TABLE hive_sales
ORGANIZATION EXTERNAL (
  TYPE ORACLE_HIVE
  DEFAULT DIRECTORY hive_dir
  ACCESS PARAMETERS (
    com.oracle.bigdata.tableName: sales
  )
);

6. ACCESS PARAMETERS

6.1 字段分隔

FIELDS TERMINATED BY ','
FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'

6.2 记录分隔

RECORDS DELIMITED BY NEWLINE
RECORDS DELIMITED BY '\n'

6.3 日期

sale_date CHAR DATE_FORMAT DATE MASK 'YYYY-MM-DD'

6.4 转换

amount CHAR(10) "TO_NUMBER(:amount)"

6.5 拒绝

REJECT LIMIT UNLIMITED
REJECT LIMIT 100

7. 修改

7.1 LOCATION

ALTER TABLE ext_sales LOCATION ('sales_2025_07.csv');

7.2 DEFAULT DIRECTORY

ALTER TABLE ext_sales DEFAULT DIRECTORY new_data_dir;

7.3 ACCESS PARAMETERS

ALTER TABLE ext_sales 
  ACCESS PARAMETERS (FIELDS TERMINATED BY '|');

8. 视图

8.1 信息

SELECT table_name, type_name, default_directory_name
FROM user_external_tables;

8.2 位置

SELECT table_name, location
FROM user_external_locations;

9. 并行

CREATE TABLE ext_sales (...) 
  ORGANIZATION EXTERNAL (...) 
  PARALLEL 4;

ALTER TABLE ext_sales PARALLEL 8;

-- 并行查询
SELECT /*+ PARALLEL(e 4) */ * FROM ext_sales e;

10. 性能

10.1 文件

- 多文件并行
- 大文件分割
- 压缩

10.2 直接路径

INSERT /*+ APPEND */ INTO sales SELECT * FROM ext_sales;

详细见:Oracle SQL 查询优化技巧


11. 应用场景

11.1 ETL 加载

-- 文件 → 外部表 → 仓库
INSERT /*+ APPEND */ INTO sales 
SELECT * FROM ext_sales;

详细见:Oracle 数据仓库 ETL 详解

11.2 数据交换

- Data Pump 格式
- 跨平台
- 快速

11.3 大数据

- HDFS
- Hive
- Big Data SQL

11.4 报表

-- 直接查询文件
SELECT region, SUM(amount) FROM ext_sales GROUP BY region;

12. 错误处理

12.1 BADFILE

- 错误记录
- 检查
- 修正

12.2 LOGFILE

- 加载日志
- 警告
- 拒绝原因

12.3 DISCARDFILE

- 不满足条件
- 检查

12.4 REJECT LIMIT

- 错误上限
- UNLIMITED
- 控制

13. 常见坑与排错

13.1 ORA-29913

- ODCI 错误
- 目录权限
- 文件格式

13.2 ORA-29400

- 数据错误
- BADFILE
- 格式

13.3 权限

- DIRECTORY 读写
- OS 文件权限

13.4 字符集

- NLS
- 字符集
- 转换

14. 最佳实践

  1. DIRECTORY:管理
  2. PARALLEL:性能
  3. APPEND:加载
  4. 多文件:并行
  5. 错误文件:监控
  6. REJECT LIMIT:控制
  7. Big Data:HDFS/Hive
  8. Data Pump:交换
  9. 压缩:空间
  10. 测试:验证

15. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “External Tables” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/external-tables-concepts.html