

# 使用 Oracle SQL\$1Loader 进行导入
<a name="Oracle.Procedural.Importing.SQLLoader"></a>

您可以考虑将 Oracle SQL\$1Loader 用于对象数量有限的大型数据库。由于从源数据库导出并加载到目标数据库的过程特定于架构，因此，下面的示例创建示例模式对象，从源导出，然后将数据加载到目标数据库。

安装 Oracle SQL\$1Loader 的最简单方法是安装 Oracle Instant Client。要下载该软件，请前往 [https://www.oracle.com/database/technologies/instant-client.html](https://www.oracle.com/database/technologies/instant-client.html)。有关文档，请参阅《Oracle 数据库实用程序》**手册中的[适用于 SQL\$1Loader、导出和导入的 Instant Client](https://docs.oracle.com/en/database/oracle/oracle-database/21/sutil/instant-client-sql-loader-export-import.html#GUID-FF1B6F75-09F5-4911-9317-9776FAD15965)。

**使用 Oracle SQL\$1Loader 导入数据**

1. 使用以下 SQL 语句创建示例源表。

   ```
   CREATE TABLE customer_0 TABLESPACE users 
      AS (SELECT ROWNUM id, o.* 
          FROM   ALL_OBJECTS o, ALL_OBJECTS x 
          WHERE  ROWNUM <= 1000000);
   ```

1. 在目标 RDS for Oracle 数据库实例上，创建用于加载数据的目标表。子句 `WHERE 1=2` 可确保复制 `ALL_OBJECTS` 的结构，但不复制任何行。

   ```
   CREATE TABLE customer_1 TABLESPACE users 
     AS (SELECT 0 AS ID, OWNER, OBJECT_NAME, CREATED
         FROM   ALL_OBJECTS
         WHERE  1=2);
   ```

1. 将数据从源数据库导出到文本文件。以下示例使用 SQL\$1Plus。对于数据，您可能需要生成用于执行数据库中所有对象导出操作的脚本。

   ```
   ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS'
   
   SET LINESIZE 800 HEADING OFF FEEDBACK OFF ARRAY 5000 PAGESIZE 0
   SPOOL customer_0.out 
   SET MARKUP HTML PREFORMAT ON
   SET COLSEP ','
   
   SELECT id, owner, object_name, created 
   FROM   customer_0; 
   
   SPOOL OFF
   ```

1. 创建一个控制文件来描述数据。您可能需要编写脚本来执行此步骤。

   ```
   cat << EOF > sqlldr_1.ctl 
   load data
   infile customer_0.out
   into table customer_1
   APPEND
   fields terminated by "," optionally enclosed by '"'
   (
     id           POSITION(01:10)    INTEGER EXTERNAL,
     owner        POSITION(12:41)    CHAR,
     object_name  POSITION(43:72)    CHAR,
     created      POSITION(74:92)    date "YYYY/MM/DD HH24:MI:SS"
   )
   ```

   如果需要，将上述代码生成的文件复制到某一暂存区域，如 Amazon EC2 实例。

1. 通过适用于目标数据库的用户名和密码，使用 SQL\$1Loader 导入数据。

   ```
   sqlldr cust_dba@targetdb CONTROL=sqlldr_1.ctl BINDSIZE=10485760 READSIZE=10485760 ROWS=1000 
   ```