プライマリ・コンテンツに移動
Oracle® Databaseユーティリティ
11gリリース2 (11.2)
B56303-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

13 外部表の概要

外部表機能は、既存のSQL*Loader機能を補足する機能です。この機能によって、データベースに表がある場合と同様に、外部ソースのデータにアクセスできます。

データ・ロード時にステージング表の追加の索引付けが必要な場合、SQL*Loaderを使用する方が有効です。SQL*Loaderと外部表との処理内容の違いについては、「SQL*Loaderと外部表との処理内容の違い」を参照してください。

この章の内容は、次のとおりです。


参照:

外部表の作成と管理の詳細は、『Oracle Database管理者ガイド』を参照してください。

外部表の作成方法

外部表は、SQLのCREATE TABLE...ORGANIZATION EXTERNAL文を使用して作成されます。外部表の作成時に、次の属性を指定します。

  • TYPE: 外部表の型を指定します。ORACLE_LOADER型およびORACLE_DATAPUMP型の2種類の型が選択可能です。外部表の各型は、固有のアクセス・ドライバによってサポートされます。

    • ORACLE_LOADERアクセス・ドライバがデフォルトです。これによって、外部表から内部表にデータがロードされます。データはテキスト・データ・ファイルからのものである必要があります。(ORACLE_LOADERアクセス・ドライバは、アンロードを実行できないため、内部表から外部表にデータを移動することはできません。)

    • ORACLE_DATAPUMPアクセス・ドライバでは、ロードおよびアンロードを実行できます。データは、バイナリのダンプ・ファイルからロードする必要があります。内部表から外部表へのロードは、バイナリのダンプ・ファイルからフェッチすることによって実行されます。内部表から外部表へのアンロードは、外部表のバイナリのダンプ・ファイルを移入することによって実行されます。ORACLE_DATAPUMPアクセス・ドライバは、SQLのCREATE TABLE AS SELECT文を使用した外部表の作成の一環としてのみダンプ・ファイルにデータを書き込むことができます。作成されたダンプ・ファイルは、何回でも読み取ることができますが、変更はできません(つまり、DML操作は実行できません)。

  • DEFAULT DIRECTORY: 明示的にディレクトリ・オブジェクトに名前を付けないすべての入出力ファイルに対して、使用するデフォルトのディレクトリを指定します。位置はディレクトリ・パスではなく、ディレクトリ・オブジェクトで指定されます。外部表を作成する前にディレクトリ・オブジェクトを作成しておく必要があります(これを行わない場合はエラーが生成されます)。詳細は、「データ・ファイルおよび出力ファイルの位置」を参照してください。

  • ACCESS PARAMETERS - 外部データ・ソースを記述し、指定された外部表の型を実装します。各外部表の型には、その外部表の型に固有のアクセス・パラメータを提供する専用のアクセス・ドライバがあります。アクセス・パラメータはオプションです。詳細は、「アクセス・パラメータ」を参照してください。

  • LOCATION: 外部表のデータ・ファイルを指定します。ファイル名は、directory:fileという書式です。directoryの部分はオプションです。この部分を指定しないと、デフォルトのディレクトリがファイルのディレクトリとして使用されます。

次の例では、これらの各属性の使用を示します(デフォルト・ディレクトリdef_dir1がすでに存在するものとします)。

SQL> CREATE TABLE emp_load
  2    (employee_number      CHAR(5),
  3     employee_dob         CHAR(20),
  4     employee_last_name   CHAR(20),
  5     employee_first_name  CHAR(15),
  6     employee_middle_name CHAR(15),
  7     employee_hire_date   DATE)
  8  ORGANIZATION EXTERNAL
  9    (TYPE ORACLE_LOADER
 10     DEFAULT DIRECTORY def_dir1
 11     ACCESS PARAMETERS
 12       (RECORDS DELIMITED BY NEWLINE
 13        FIELDS (employee_number      CHAR(2),
 14                employee_dob         CHAR(20),
 15                employee_last_name   CHAR(18),
 16                employee_first_name  CHAR(11),
 17                employee_middle_name CHAR(11),
 18                employee_hire_date   CHAR(10) date_format DATE mask "mm/dd/yyyy"
 19               )
 20       )
 21     LOCATION ('info.dat')
 22    );
 
Table created.

アクセス・ドライバで指定する情報により、データ・ソースのデータが、外部表の定義と一致するように処理されます。CREATE TABLE emp_loadの後にリストされるフィールドが、実際にinfo.datソース・ファイル内のデータのメタデータを定義します。

データ・ファイルおよび出力ファイルの位置

アクセス・ドライバは、データベース・サーバー内で実行されます。これは、SQL*Loaderが、ロードするデータをサーバーに送信するクライアント・プログラムであるという点で、SQL*Loaderとは異なります。この違いは、次のことを意味しています。

  • サーバーでは、アクセス・ドライバによってロードされるファイルにアクセスする必要があります。

  • サーバーでは、アクセス・ドライバによって作成された出力ファイル(ログ・ファイル、不良ファイルおよび廃棄ファイル)、およびORACLE_DATAPUMPアクセス・ドライバによって作成されたダンプ・ファイルの作成と書込みを行う必要があります。

アクセス・ドライバでは、ディレクトリ・オブジェクトを使用して、ファイルの読取りおよび書込みを行う位置を指定する必要があります。ディレクトリ・オブジェクトは、ファイル・システムのディレクトリ名に名前をマップします。たとえば、次の文は/usr/apps/datafilesにあるディレクトリにマップされる、ext_tab_dirという名前のディレクトリ・オブジェクトを作成します。

CREATE DIRECTORY ext_tab_dir AS '/usr/apps/datafiles';

ディレクトリ・オブジェクトは、DBAまたはCREATE ANY DIRECTORY権限を持つすべてのユーザーが作成できます。


注意:

Oracle Real Applications Cluster(Oracle RAC)構成で外部表を使用するには、ディレクトリ・オブジェクトのパスがクラスタ・ファイル・システム上に存在するようにする必要があります。

ディレクトリの作成後、ディレクトリ・オブジェクトを作成するユーザーは、そのディレクトリのREAD権限およびWRITE権限を他のユーザーに付与する必要があります。これらの権限は、ロールを使用して割り当てるのではなく、明示的に付与する必要があります。たとえば、ext_tab_dirで指定されたディレクトリのユーザーscottのかわりに、サーバーがファイルを読み込むことができるようにするには、ディレクトリ・オブジェクトを作成したユーザーが、次のコマンドを実行する必要があります。

GRANT READ ON DIRECTORY ext_tab_dir TO scott;

SYSユーザーのみがディレクトリ・オブジェクトを所有できます。ただし、SYSユーザーは、ディレクトリ・オブジェクトを作成する権限を他のユーザーに付与できます。ディレクトリ・オブジェクトへのREAD 権限またはWRITE権限は、Oracle Databaseによるファイルの読取りまたは書込みのみを意味します。適切なオペレーティング・システム権限がないかぎり、Oracle Databaseの外部にあるファイルには直接アクセスできません。同様に、Oracle Databaseには、ディレクトリのファイルに対して読取りおよび書込みを行うオペレーティング・システム権限が必要です。

アクセス・パラメータ

特定の型の外部表を作成する場合、アクセス・パラメータを指定して、アクセス・ドライバのデフォルトの動作を変更できます。各アクセス・ドライバには、アクセス・パラメータ用の固有の構文があります。外部表に使用する、ORACLE_LOADERORACLE_DATAPUMPの2つのアクセス・ドライバが提供されています。


注意:

これらのアクセス・パラメータは、SQL文のCREATE TABLE...ORGANIZATION EXTERNALopaque_format_specとしてまとめて参照されます。


参照:


外部表の使用時のデータ型の変換

データを外部表から、または外部表に移動すると、次の3つの場所にある同一の列が、異なるデータ型を持つ可能性があります。

  • データベース: データが外部表アンロードされる際のソースであり、データが外部表からロードされるときのロード先です。

  • 外部表: データが外部表にアンロードされると、外部表内の列のデータ型と一致するよう、データベースからのデータは必要に応じて変換されます。また、SQL演算子をソース・データに適用して、データを外部表に移動する前にデータ型を変更できます。同様に、外部表からデータベースにロードすると、外部表からのデータはデータベース内の列のデータ型と一致するよう自動的に変換されます。さらに、外部表から選択しているSQL文内のSQL演算子を使用して、他の変換も実行できます。より高いパフォーマンスを得るには、外部表のデータ型を、データベースのデータ型と一致させます。

  • データ・ファイル: データを外部表にアンロードすると、データ・ファイルのフィールドのデータ型は外部表のフィールドのデータ型と完全に一致します。ただし、外部表からデータをロードすると、データ・ファイルのデータ型が外部表のデータ型と一致しない場合があります。その場合、データ・ファイルからのデータは、外部表のデータ型と一致するよう変換されます。列の変換時にエラーが発生した場合、その列を含むレコードはロードされません。より高いパフォーマンスを得るには、データ・ファイルのデータ型を、外部表のデータ型と一致させます。

データ・ファイルと外部表の間で変換エラーが発生すると、エラーの発生した行は無視されます。変換エラーおよび制約違反を含む、外部表とデータベース内の列でエラーが発生すると、操作全体が正常に完了されないまま終了します。

データが外部表にアンロードされる際に、ソース表内の列のデータ型が外部表の列のデータ型と一致していない場合、データが変換されます。変換エラーが発生した場合、その時点までに処理されたすべての行がデータ・ファイルに含まれず、データ・ファイルの読取りができなくなる場合があります。変換エラーによる操作の異常終了を回避するには、外部表の列のデータ型とデータベースの列のデータ型を一致させます。ただし、外部表はすべてのデータ型をサポートするわけではないため、必ず成功するとはかぎりません。そのような場合、ソース表でサポートされていないデータ型を、外部表でサポートするデータ型に変換する必要があります。たとえば、LONG_TABという名前のソース表にLONG列がある場合、作成される外部表LONG_TAB_XTの対応する列はCLOBである必要があり、外部表を移入するために使用したSELECT副問合せは、列をロードするためにTO_LOB演算子を使用する必要があります。

CREATE TABLE LONG_TAB_XT (LONG_COL CLOB) ORGANIZATION EXTERNAL...SELECT TO_LOB(LONG_COL) FROM LONG_TAB;

外部表の制限事項

この項では、外部表機能で行われない処理および外部表処理上の制限事項について説明します。

  • 暗号化された列がある外部表のエクスポートとインポートは、サポートされていません。

  • 外部表には、データベースに格納されているデータは記述されません。

  • 外部表には、外部ソースでのデータの格納方法は記述されません。これは、アクセス・パラメータの機能です。

  • 列処理: デフォルトでは、外部表の機能は、外部表に定義されたすべての列をフェッチします。これによって、すべての問合せに対し、一貫した結果が保証されます。ただし、パフォーマンスを考慮して、外部表内で参照される列だけを処理することができます。これによって、データ変換の量および問合せの実行で必要なデータ処理の量を最小限にします。この場合、データ型変換エラーが発生した列を含んでいたために拒否された行も、その列が参照されないかぎり、別の問合せでは拒否されません。ALTER TABLEコマンドを使用すると、この列処理動作を変更できます。

  • 外部表は、LONG列にデータをロードできません。

  • ORACLE_LOADERアクセス・ドライバのアクセス・パラメータにSQL文字列を指定できません。解決策として、外部表を読み取る文のSELECT句にDECODE句を使用できます。また、DECODE句を使用する外部表のビューを作成して、外部表ではなくそのビューから選択することもできます。

  • 外部表アクセス・パラメータにおいて列名や表名などの識別子が指定される場合、特定の値はアクセス・パラメータ・パーサーによって予約語とみなされます。予約語を識別子として使用するには、二重引用符で囲む必要があります。