

# 在 RDS for Oracle 中使用外部表
<a name="Appendix.Oracle.CommonDBATasks.External_Tables"></a>

*Oracle 外部表*是具有不在数据库中数据的表。这些数据位于数据库可以访问的外部文件中。使用外部表，您可以访问数据而无需将其加载到数据库中。有关外部表的更多信息，请参阅 Oracle 文档中的[管理外部表](http://docs.oracle.com/database/121/ADMIN/tables.htm#ADMIN01507)。

使用 Amazon RDS，您可以将外部表文件存储在目录对象中。您可以创建目录对象，或者使用 Oracle 数据库中预定义的目录对象，例如 DATA\$1PUMP\$1DIR 目录。有关创建目录对象的信息，请参阅[在主数据存储空间中创建和删除目录](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.NewDirectories)。您可以查询 ALL\$1DIRECTORIES 视图来列出您的 Amazon RDS Oracle 数据库实例的目录对象。

**注意**  
目录对象指向由实例使用的主数据存储空间 (Amazon EBS 卷)。—包括数据文件、重做日志、审核、跟踪和其他文件在内—所用的空间均计入分配的存储中。

您可以使用 [ DBMS\$1FILE\$1TRANSFER](https://docs.oracle.com/database/121/ARPLS/d_ftran.htm#ARPLS095) 包或 [UTL\$1FILE](https://docs.oracle.com/database/121/ARPLS/u_file.htm#ARPLS069) 包，将外部数据文件从一个 Oracle 数据库移动到另一个。外部数据文件从源数据库上的目录移至目标数据库上的指定目录中。有关使用 `DBMS_FILE_TRANSFER` 的信息，请参阅 [使用 Oracle Data Pump 导入](Oracle.Procedural.Importing.DataPump.md)。

移动外部数据文件之后，您可以用它来创建外部表。以下示例创建使用 USER\$1DIR1 目录中 `emp_xt_file1.txt` 文件的外部表。

```
CREATE TABLE emp_xt (
  emp_id      NUMBER,
  first_name  VARCHAR2(50),
  last_name   VARCHAR2(50),
  user_name   VARCHAR2(20)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY USER_DIR1
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    (emp_id,first_name,last_name,user_name)
  )
  LOCATION ('emp_xt_file1.txt')
)
PARALLEL
REJECT LIMIT UNLIMITED;
```

假设您要将位于 Amazon RDS Oracle 数据库实例中的数据移动到外部数据文件中。在这种情况下，您可以通过创建外部表并从数据库中的表选择数据来填充外部数据文件。例如，以下 SQL 语句通过查询数据库中的 `orders_xt` 表创建 `orders` 外部表。

```
CREATE TABLE orders_xt
  ORGANIZATION EXTERNAL
   (
     TYPE ORACLE_DATAPUMP
     DEFAULT DIRECTORY DATA_PUMP_DIR
     LOCATION ('orders_xt.dmp')
   )
   AS SELECT * FROM orders;
```

在此示例中，数据填充到 DATA\$1PUMP\$1DIR 目录的 `orders_xt.dmp` 文件中。