日本語PDF

16 ORACLE_DATAPUMPアクセス・ドライバ

ORACLE_DATAPUMPアクセス・ドライバは、ORACLE_DATAPUMP型の外部表に固有のアクセス・パラメータのセットを提供します。

トピック:

16.1 ORACLE_DATAPUMPアクセス・ドライバの使用

アクセス・ドライバのデフォルト動作を変更するには、ORACLE_DATAPUMPアクセス・パラメータを使用します。アクセス・ドライバで指定する情報により、データ・ソースのデータが、外部表の定義と一致するように処理されます。

ORACLE_DATAPUMPアクセス・ドライバを正しく使用するには、使用するプラットフォームのデータ・ファイルのファイル形式およびレコード形式(文字セット、フィールドのデータ型など)についての知識が必要です。また、SQLを使用して外部表を作成し、作成した表に対して問合せを実行できる必要もあります。

ノート:

  • 章の後半で説明されているその他の構文を使用しなければ、わかりにくい場合があります。構文によって行われる処理が明確でない場合は、先に進み、その説明を参照できます。

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

16.2 access_parameters句

外部表の作成時に、access_parameters句内の特定のパラメータを指定できます。

この句およびその個別のパラメータはオプションです。たとえば、LOGFILEを指定し、VERSIONは指定しない、またはその逆も可能です。access_parameters句の構文は次のとおりです。

ノート:

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

関連項目:

16.2.1 コメント

コメントは、2つのハイフンで始まり、その後にテキストが続く行です。コメントは、次の例のように、アクセス・パラメータより前に位置する必要があります。

--This is a comment.
--This is another comment.
NOLOG

二重ハイフンの右側のすべてのテキストは行末まで無視されます。

16.2.2 COMPRESSION

デフォルト: DISABLED

用途

データをダンプ・ファイル・セットに書き込む前にデータを圧縮するかどうかと、使用する圧縮アルゴリズム(オプション)を指定します。

構文および説明

COMPRESSION [ENABLED {BASIC | LOW| MEDIUM | HIGH} | DISABLED]
  • ENABLEDを指定すると、アンロード操作全体ですべてのデータが圧縮されます。追加で次の圧縮オプションのいずれかを指定できます。

    • BASIC: 圧縮率と速度の適度な組合せが実現し、使用されるアルゴリズムはOracle Data Pumpの以前のバージョンと同じです。

    • LOW: アンロード・スループットへの影響を最小限に抑えます。CPUリソースが限定要因となっている環境に適しています。

    • MEDIUM: ほとんどの環境に適しています。このオプションはBASICオプションと同様、圧縮率と処理速度を加味したよい組合せですが、BASICとは異なるアルゴリズムが使用されています。

    • HIGH: ネットワーク速度が限定要因となっている、速度が遅いネットワークを使用するアンロードに最適です。

    ノート:

    これらの圧縮アルゴリズムを使用するには、COMPATIBLE初期化パラメータを12.0.0以上に設定する必要があります。この機能では、Oracle Advanced Compressionオプションを有効にする必要があります。

    圧縮アルゴリズムのパフォーマンスは、そのCPU使用量および圧縮率(非圧縮の入力に対する割合としての圧縮済の出力のサイズ)によって特徴付けられます。これらの測定値は、使用される圧縮アルゴリズムの速度に加え、入力のサイズおよびタイプに応じて変化します。基本的に圧縮率はLOWからHIGHへと高くなります。ただし、圧縮率の上昇に応じて、消費されるCPUリソースが多くなります。

    ご使用の環境で、データに対して様々な圧縮レベルをテストすることをお薦めします。エクスポートされるダンプ・ファイル・セットの圧縮レベルがパフォーマンスおよび記憶域要件を満たすようにするには、環境、ワークロードの特性、およびデータのサイズとタイプに基づいて圧縮レベルを選択します。

  • DISABLEDを指定すると、アップロード操作でデータは圧縮されません。

次の例では、COMPRESSIONパラメータがENABLEDに設定されています。したがって、dept.dmpダンプ・ファイルに書き込まれるすべてのデータは圧縮形式になります。

CREATE TABLE deptXTec3
 ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY def_dir1
 ACCESS PARAMETERS (COMPRESSION ENABLED) LOCATION ('dept.dmp'));

16.2.3 ENCRYPTION

デフォルト

DISABLED

用途

ダンプ・ファイル・セットに書き込む前にデータを暗号化するかどうかを指定します。

構文および説明

ENCRYPTION [ENABLED | DISABLED]

ENABLEDを指定すると、すべてのデータが暗号化形式でダンプ・ファイル・セットに書き込まれます。

DISABLEDを指定すると、データは暗号化形式でダンプ・ファイル・セットに書き込まれません。

制限事項

このパラメータは、エクスポート操作でのみ使用します。

次の例では、ENCRYPTIONパラメータがENABLEDに設定されています。したがって、dept.dmpファイルに書き込まれるすべてのデータは暗号化形式になります。

CREATE TABLE deptXTec3
 ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY def_dir1
 ACCESS PARAMETERS (ENCRYPTION ENABLED) LOCATION ('dept.dmp')); 

16.2.4 LOGFILE | NOLOGFILE

デフォルト: LOGFILEが指定されない場合、デフォルトのディレクトリにログ・ファイルが作成され、ログ・ファイルの名前は、表名および.logの拡張子を持つプロセスIDから生成されます。ログ・ファイルがすでに同じ名前で存在する場合は、アクセス・ドライバによってそのログ・ファイルが再びオープンされ、新しいログ情報がファイルの終わりに追加されます。

用途

LOGFILEは、ダンプ・ファイルのアクセス中に生成されたすべてのメッセージを含むログ・ファイルの名前を指定します。NOLOGFILEを使用してログ・ファイルの作成を回避できます。

構文および説明

NOLOGFILE

または

LOGFILE [directory_object:]logfile_name

ログ・ファイル名の一部としてディレクトリ・オブジェクトを指定しない場合、DEFAULT DIRECTORY属性で指定されたディレクトリ・オブジェクトが使用されます。ディレクトリ・オブジェクトが指定されず、デフォルトのディレクトリも指定されない場合は、エラーが返されます。置換変数を使用してパラレル・ロードおよびパラレル・アンロード中に一意のファイル名を作成する方法については、「LOGFILEのファイル名」を参照してください。

次の例では、ダンプ・ファイルdept_dmpは、ディレクトリ・オブジェクトload_dirで識別されるディレクトリ内にありますが、ログ・ファイルdeptxt.logは、ディレクトリ・オブジェクトlog_dirで識別されるディレクトリ内にあります。

CREATE TABLE dept_xt (dept_no INT, dept_name CHAR(20), location CHAR(20))
ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY load_dir 
ACCESS PARAMETERS (LOGFILE log_dir:deptxt) LOCATION ('dept_dmp'));
16.2.4.1 パラレル・ロードのログ・ファイル・ネーミング

パラレル・ロードでファイル名を一意にするには、アクセス・ドライバで記号置換を行います。サポートされている記号置換は次のとおりです。

  • %pは、現行のプロセスのプロセスIDに置換されます。たとえば、アクセス・ドライバのプロセスIDが12345の場合、exttab_%p.logは、exttab_12345.logとなります。

  • %aは、現行のプロセスのエージェント番号に置換されます。エージェント番号は、外部表にアクセスしている各パラレル・プロセスに割り当てられた一意の番号です。この番号には、3文字になるように、左側に0が埋められます。たとえば、3番目のパラレル・エージェントがファイルを作成する際に、exttab_%a.logがファイル名として指定されている場合、エージェントはexttab_003.logというファイルを作成します。

  • %%は、%に置換されます。ファイル名にパーセント符号が必要な場合、この記号置換を使用する必要があります。

%文字に前述のリスト内の文字以外の文字が続く場合、エラーが返されます。

%pまたは%aを使用しないで出力ファイルに対して一意のファイル名を作成し、外部表にパラレルでアクセス中の場合、出力ファイルが破損するか、エージェントがファイルに書込みをできないという問題が発生する場合があります。

ファイルに対して拡張子が指定されていない場合は、デフォルトの拡張子である.logが使用されます。生成された名前が有効なファイル名ではない場合、エラーが返され、データのロードまたはアンロードは行われません。

16.2.5 VERSION句

VERSION句は、ダンプ・ファイルを読み取るOracle Databaseの最低のリリースを指定するために使用されます。

たとえば、11.1と指定すると、Oracle Database 11gリリース1 (11.1および11.2)データベースの両方でダンプ・ファイルを読み取ることができます。11.2と指定すると、Oracle Database 11gリリース2(11.2)データベースのみがダンプ・ファイルを読み取ることができます。

デフォルト値はCOMPATIBLEです。

16.2.6 SQL ENCRYPT句の使用による影響

外部表の作成時にSQL ENCRYPT句を指定する場合は、次の点に注意してください。

  • ENCRYPT句を指定した列は、暗号化されてからダンプ・ファイルに書き込まれます。

  • ダンプ・ファイルを別のデータベースに移動する場合は、ダンプ・ファイルの暗号化列とダンプ・ファイルの読込みに使用する外部表の両方で、同じ暗号化パスワードを使用する必要があります。

  • 2つ目のデータベースの外部表で暗号化されている正しい列に対してパスワードを指定しなかった場合は、エラーが発生します。指定したパスワードが正しくない場合は、ダンプ・ファイルのデータが無効になります。

  • 作成するダンプ・ファイルのリリースは10.2以上にする必要があります。それ以外の場合はエラーが戻されます。

関連項目:

CREATE TABLE文でのENCRYPT句の使用方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

16.3 ORACLE_DATAPUMPアクセス・ドライバを使用したデータのアンロードとロード

ORACLE_DATAPUMPアクセス・ドライバは、SQLのCREATE TABLE AS SELECT文を使用した外部表の作成の一環として、ダンプ・ファイルにデータを書き込むことができます。

ファイル内のデータは、バイナリ形式で記述され、ORACLE_DATAPUMPアクセス・ドライバによってのみ読取りが可能です。作成されたダンプ・ファイルは変更できません(つまり、ダンプ・ファイルに対してデータ操作言語(DML)操作は実行できません)。ただし、このファイルは何回でも読み取ることができ、別の外部表のダンプ・ファイルとして同じデータベースまたは異なるデータベースで使用できます。

次のステップではサンプル・スキーマoeを使用して、ORACLE_DATAPUMPアクセス・ドライバを使用したデータのアンロード方法およびロード方法の例を示します。(例では、ディレクトリ・オブジェクトdef_dir1がすでに存在し、ユーザーoeにはそれに対する読取りおよび書込み権限が付与されているとします。)

  1. 外部表は、AS SELECT句を使用した外部表の作成の一環としてのみファイルにデータを移入します。次の例では、inventories_xtという名前の外部表を作成し、外部表のダンプ・ファイルにoeスキーマ内のinventories表のデータを移入します。
    SQL> CREATE TABLE inventories_xt
      2  ORGANIZATION EXTERNAL
      3  (
      4    TYPE ORACLE_DATAPUMP
      5    DEFAULT DIRECTORY def_dir1
      6    LOCATION ('inv_xt.dmp')
      7  )
      8  AS SELECT * FROM inventories;
    
    Table created.
    
  2. inventoriesおよび新しい外部表の両方を、次のとおり記述します。その両方は一致している必要があります。
    SQL> DESCRIBE inventories
     Name                                      Null?    Type
     ---------------------------------------- --------- ----------------
     PRODUCT_ID                                NOT NULL NUMBER(6)
     WAREHOUSE_ID                              NOT NULL NUMBER(3)
     QUANTITY_ON_HAND                          NOT NULL NUMBER(8)
    
    SQL> DESCRIBE inventories_xt
     Name                                      Null?    Type
     ----------------------------------------- -------- -----------------
     PRODUCT_ID                                NOT NULL NUMBER(6)
     WAREHOUSE_ID                              NOT NULL NUMBER(3)
     QUANTITY_ON_HAND                          NOT NULL NUMBER(8)
    
  3. 作成された外部表は、他の表と同様に問合せを行うことができます。たとえば、次のように外部表のレコード数を選択します。
    SQL> SELECT COUNT(*) FROM inventories_xt;
    
      COUNT(*)
    ----------
          1112
    
  4. 外部表のデータをinventoriesのデータと比較します。違いがないことを確認します。
    SQL> SELECT * FROM inventories MINUS SELECT * FROM inventories_xt;
    
    no rows selected
    
  5. 外部表が作成され、CREATE TABLE AS SELECT文によりダンプ・ファイルが移入された後では、外部表に対する行の追加、更新または削除は実行できません。外部表のデータの変更を試みると、エラーが発生します。

    次の例では、既存の外部表へのデータ操作言語(DML)の使用を試みます。次のエラーが返されます。

    SQL> DELETE FROM inventories_xt WHERE warehouse_id = 5;
    DELETE FROM inventories_xt WHERE warehouse_id = 5
                *
    ERROR at line 1:
    ORA-30657: operation not supported on external organized table
    
  6. 外部表に対して作成されたダンプ・ファイルは移動できるようになり、同じデータベースまたは異なるデータベース内の別の外部表のダンプ・ファイルとして使用できます。既存のファイルを使用する外部表を作成した場合、CREATE TABLE文のAS SELECT句は存在しません。
    SQL> CREATE TABLE inventories_xt2
      2  (
      3    product_id          NUMBER(6),
      4    warehouse_id        NUMBER(3),
      5    quantity_on_hand    NUMBER(8)
      6  )
      7  ORGANIZATION EXTERNAL
      8  (
      9    TYPE ORACLE_DATAPUMP
     10    DEFAULT DIRECTORY def_dir1
     11    LOCATION ('inv_xt.dmp')
     12  );
    
    Table created.
    
  7. 新しい外部表のデータをinventories表のデータと比較します。比較する前に、product_idフィールドは互換性のあるデータ型に変換されます。違いがないことを確認します。
    SQL> SELECT * FROM inventories MINUS SELECT * FROM inventories_xt2;
    
    no rows selected
    
  8. 3つのダンプ・ファイルおよび3の並列度の外部表を作成します。
    SQL> CREATE TABLE inventories_xt3
      2  ORGANIZATION EXTERNAL
      3  (
      4    TYPE ORACLE_DATAPUMP
      5    DEFAULT DIRECTORY def_dir1
      6    LOCATION ('inv_xt1.dmp', 'inv_xt2.dmp', 'inv_xt3.dmp')
      7  )
      8  PARALLEL 3
      9  AS SELECT * FROM inventories;
    
    Table created.
    
  9. アンロードされたデータとinventoriesを比較します。違いがないことを確認します。
    SQL> SELECT * FROM inventories MINUS SELECT * FROM inventories_xt3;
    
    no rows selected
    
  10. inventories表の数行を含む外部表を作成します。
    SQL> CREATE TABLE inv_part_xt
      2  ORGANIZATION EXTERNAL
      3  (
      4  TYPE ORACLE_DATAPUMP
      5  DEFAULT DIRECTORY def_dir1
      6  LOCATION ('inv_p1_xt.dmp')
      7  )
      8  AS SELECT * FROM inventories WHERE warehouse_id < 5;
     
    Table created.
    
  11. inventoriesの残りの行を含む別の外部表を作成します。
    SQL> drop table inv_part_xt;
     
    Table dropped.
     
    SQL> 
    SQL> CREATE TABLE inv_part_xt
      2  ORGANIZATION EXTERNAL
      3  (
      4  TYPE ORACLE_DATAPUMP
      5  DEFAULT DIRECTORY def_dir1
      6  LOCATION ('inv_p2_xt.dmp')
      7  )
      8  AS SELECT * FROM inventories WHERE warehouse_id >= 5;
     
    Table created.
    
  12. ステップ10およびステップ11で作成した2つのダンプ・ファイルを使用する外部表を作成します。
    SQL> CREATE TABLE inv_part_all_xt
      2  (
      3  product_id NUMBER(6),
      4  warehouse_id NUMBER(3),
      5  quantity_on_hand NUMBER(8)
      6  )
      7  ORGANIZATION EXTERNAL
      8  (
      9  TYPE ORACLE_DATAPUMP
     10  DEFAULT DIRECTORY def_dir1
     11  LOCATION ('inv_p1_xt.dmp','inv_p2_xt.dmp')
     12  );
     
    Table created.
    
  13. 新しい外部表とinventories表を比較します。違いがないことを確認します。これは、外部表の作成で使用された2つのダンプ・ファイルに同じメタデータ(同じ表名inv_part_xt、同じ列情報など)があるためです。
    SQL> SELECT * FROM inventories MINUS SELECT * FROM inv_part_all_xt;
    
    no rows selected

16.3.1 パラレル・ロードおよびパラレル・アンロード

このトピックでは、パラレル・ロードおよびパラレル・アンロードについて説明します。

ダンプ・ファイルは、記述されるすべてのデータを保持できるサイズのディスクに格納する必要があります。すべてのデータを保持できない容量の場合、CREATE TABLE AS SELECT文に対してエラーが返されます。この問題を軽減するには、CREATE TABLE AS SELECT文の実行時に複数のディレクトリ・オブジェクトを作成するという方法があります。ただし、これらのディレクトリは、異なるディスクに存在する必要があります。LOCATION句でdirectory:file形式を使用して複数の位置を指定し、PARALLEL句を指定することで複数のファイルを作成できます。外部表を移入するために作成された各パラレルI/Oサーバー・プロセスでは、固有のファイルに書込みを実行します。各I/Oサーバー・プロセスには固有のファイルが必要であるため、LOCATION句のファイル数と並列度が一致している必要があります。余分なファイルを指定した場合は、すべて無視されます。指定された並列度に対して必要数のファイルが存在しない場合、LOCATION句のファイル数と一致するよう並列度が下げられます。

inventories表の3つのファイルへのアンロードの例を次に示します。

SQL> CREATE TABLE inventories_XT_3
  2  ORGANIZATION EXTERNAL
  3  (
  4    TYPE ORACLE_DATAPUMP
  5    DEFAULT DIRECTORY def_dir1
  6    LOCATION ('inv_xt1.dmp', 'inv_xt2.dmp', 'inv_xt3.dmp')
  7  )
  8  PARALLEL 3
  9  AS SELECT * FROM oe.inventories;

Table created.

ORACLE_DATAPUMPアクセス・ドライバを使用してデータをロードする場合は、パラレル処理で、複数のダンプ・ファイルや同じダンプ・ファイルのチャンクも同時に読み取ることができます。したがって、ファイルが複数のファイル・オフセットを含むことができる大きさであれば、ダンプ・ファイルが1つであっても、データをパラレルでロードできます。ORACLE_DATAPUMP外部表から読み込む場合、並列度はLOCATION句のファイル数に関連付けられません。

16.3.2 ダンプ・ファイルの結合

異なる外部表から移入されたすべてのダンプ・ファイルは、別の外部表のLOCATION句で指定できます。

たとえば、異なる本番データベースのデータを個別のファイルにアンロードし、次にそれらのファイルをデータ・ウェアハウスで定義された外部表に含めることができます。これにより、複数のソースから容易にデータを集計できます。唯一の制限は、すべての外部表のメタデータが完全に同じでなければいけない必要がある点です。つまり、文字セット、タイムゾーン、スキーマ名、表名および列名がすべて一致する必要があります。また、列は同じ順序で定義され、そのデータ型も完全に同一である必要があります。1つ目の外部表を作成した後で、2つ目の外部表に同じ表名を使用できるようにするには、1つ目の外部表を削除する必要があります。こうすることで、2つのダンプ・ファイルにリストされたメタデータは同じ状態になり、これらのダンプ・ファイルを同時に使用して同じ外部表を作成できます。

SQL> CREATE TABLE inv_part_1_xt
  2  ORGANIZATION EXTERNAL
  3  (
  4    TYPE ORACLE_DATAPUMP
  5    DEFAULT DIRECTORY def_dir1
  6    LOCATION ('inv_p1_xt.dmp')
  7  )
  8  AS SELECT * FROM oe.inventories WHERE warehouse_id < 5;

Table created.

SQL> DROP TABLE inv_part_1_xt;

SQL> CREATE TABLE inv_part_1_xt
  2  ORGANIZATION EXTERNAL
  3  (
  4    TYPE ORACLE_DATAPUMP
  5    DEFAULT directory def_dir1
  6    LOCATION ('inv_p2_xt.dmp')
  7  )
  8  AS SELECT * FROM oe.inventories WHERE warehouse_id >= 5;

Table created.

SQL> CREATE TABLE inv_part_all_xt
  2  (
  3    PRODUCT_ID          NUMBER(6),
  4    WAREHOUSE_ID        NUMBER(3),
  5    QUANTITY_ON_HAND    NUMBER(8)
  6  )
  7  ORGANIZATION EXTERNAL
  8  (
  9    TYPE ORACLE_DATAPUMP
 10    DEFAULT DIRECTORY def_dir1
 11    LOCATION ('inv_p1_xt.dmp','inv_p2_xt.dmp')
 12  );

Table created.

SQL> SELECT * FROM inv_part_all_xt MINUS SELECT * FROM oe.inventories;

no rows selected

16.4 サポートされるデータ型

このトピックでは、サポートされるデータ型について説明します。

外部表を使用してデータベース間でデータを移動する際には、次のような問題があります。

  • 2つのプラットフォーム間で、データベースの文字セットとデータベースの各国語文字セットが異なる場合があります。

  • 2つのデータベースで、プラットフォームのエンディアンが異なる場合があります。

ORACLE_DATAPUMPアクセス・ドライバは、これらの状況の一部を自動的に解消します。

次のデータ型は、ロード時およびアンロード時に自動的に変換されます。

  • 文字(CHARNCHARVARCHAR2NVARCHAR2)

  • RAW

  • NUMBER

  • 日時

  • BLOB

  • CLOBおよびNCLOB

  • ROWIDおよびUROWID

外部表でサポートされていないデータ型を使用するとエラーが返されます。サポートされていないデータ型であるLONGを使用した例を次に示します。

SQL> CREATE TABLE bad_datatype_xt
  2  (
  3    product_id             NUMBER(6),
  4    language_id            VARCHAR2(3),
  5    translated_name        NVARCHAR2(50),
  6    translated_description LONG
  7  )
  8  ORGANIZATION EXTERNAL
  9  (
 10    TYPE ORACLE_DATAPUMP
 11    DEFAULT DIRECTORY def_dir1
 12    LOCATION ('proddesc.dmp')
 13  );
  translated_description LONG
  *
ERROR at line 6:
ORA-30656: column type not supported on external organized table

16.5 サポートされないデータ型

このトピックでは、サポートされないデータ型について説明します。

外部表は、列に対して有効なすべてのデータ型のサブセットをサポートしています。特に、文字データ型(LONGを除く)、RAWデータ型、すべての数値データ型、およびすべての日付、タイムスタンプ、期間データ型をサポートしています。

この項では、ORACLE_DATAPUMPアクセス・ドライバを使用して、サポートされていないデータ型のデータをアンロードおよび再ロードする方法を説明します。サポートされないデータ型の一部を次に示します。

  • BFILE

  • LONGおよびLONG RAW

  • FINALオブジェクト型

  • FINALオブジェクト型の表

16.5.1 BFILEデータ型のアンロードおよびロード

BFILEデータ型には、ファイルのディレクトリ・オブジェクトとディレクトリ・オブジェクト内のファイル名という2つの情報が格納されます。

ORACLE_DATAPUMPアクセス・ドライバを使用して、ディレクトリ・オブジェクト名およびファイル名を外部表の2つの列に格納することにより、BFILE列をアンロードできます。DBMS_LOB.FILEGETNAMEプロシージャは両方の名前を返します。ただし、これはプロシージャであるため、SELECT文では使用できません。かわりに、2つのファンクションを使用します。最初のファンクションは、ディレクトリ・オブジェクト名を返し、2つ目のファンクションはファイル名を返します。

次のステップでは、BFILEデータ型のアンロードおよびロードの例を示します。

  1. BFILE 列のディレクトリ・オブジェクトを抽出するファンクションを作成します。列がNULLの場合は、NULLが返されます。
    SQL> CREATE FUNCTION get_dir_name (bf BFILE) RETURN VARCHAR2 IS
      2  DIR_ALIAS VARCHAR2(255);
      3  FILE_NAME VARCHAR2(255);
      4  BEGIN
      5    IF bf is NULL
      6    THEN
      7      RETURN NULL;
      8    ELSE
      9      DBMS_LOB.FILEGETNAME (bf, dir_alias, file_name);
     10      RETURN dir_alias;
     11    END IF;
     12  END;
     13  /
    
    Function created.
    
  2. BFILE列のファイル名を抽出するファンクションを作成します。
    SQL> CREATE FUNCTION get_file_name (bf BFILE) RETURN VARCHAR2 is
      2  dir_alias VARCHAR2(255);
      3  file_name VARCHAR2(255);
      4  BEGIN
      5    IF bf is NULL
      6    THEN
      7      RETURN NULL;
      8    ELSE
      9      DBMS_LOB.FILEGETNAME (bf, dir_alias, file_name);
     10      RETURN file_name;
     11    END IF;
     12  END;
     13  /
    
    Function created.
    
  3. 次のように、BFILE列にNULL値を持つ行を追加できます。
    SQL> INSERT INTO PRINT_MEDIA (product_id, ad_id, ad_graphic)
      2  VALUES (3515, 12001, NULL);
    
    1 row created.
    

    新しく作成したファンクションを使用して外部表を移入できます。BFILE列がNULLの場合、ファンクションはad_graphic_dir列およびad_graphic_file列をNULLに設定します。

  4. print_media表からのデータを含める外部表を作成します。get_dir_nameおよびget_file_nameファンクションを使用して、BFILE列の構成要素を取得します。
    SQL> CREATE TABLE print_media_xt
      2  ORGANIZATION EXTERNAL
      3  (
      4    TYPE oracle_datapump
      5    DEFAULT DIRECTORY def_dir1
      6    LOCATION ('pm_xt.dmp')
      7  ) AS
      8  SELECT product_id, ad_id,
      9         get_dir_name (ad_graphic) ad_graphic_dir,
     10         get_file_name(ad_graphic) ad_graphic_file
     11  FROM print_media;
    
    Table created.
    
  5. 外部表内のデータからBFILE列をロードするファンクションを作成します。外部表のad_graphic_dir列がNULLの場合、ファンクションはNULLを返します。
    SQL> CREATE FUNCTION get_bfile (dir VARCHAR2, file VARCHAR2) RETURN
    BFILE is
      2  bf BFILE;
      3  BEGIN
      4    IF dir IS NULL
      5    THEN
      6      RETURN NULL;
      7    ELSE
      8      RETURN BFILENAME(dir,file);
      9    END IF;
     10  END;
     11  /
    
    Function created.
    
  6. get_bfileファンクションを使用してBFILE列を含む新しい表を移入できます。
    SQL> CREATE TABLE print_media_int AS
      2  SELECT product_id, ad_id,
      3         get_bfile (ad_graphic_dir, ad_graphic_file) ad_graphic
      4  FROM print_media_xt;
    
    Table created.
    
  7. 新しくロードされた表の列にあるデータと、print_media表の列のデータは一致している必要があります。
    SQL> SELECT product_id, ad_id,
      2         get_dir_name(ad_graphic),
      3         get_file_name(ad_graphic)
      4  FROM print_media_int
      5  MINUS
      6  SELECT product_id, ad_id,
      7         get_dir_name(ad_graphic),
      8         get_file_name(ad_graphic)
      9  FROM print_media;
    
    no rows selected

16.5.2 LONGおよびLONG RAWデータ型のアンロード

ORACLE_DATAPUMPアクセス・ドライバは、LONG列およびLONG RAW列のアンロードに使用できますが、データはLOBフィールドにのみ再ロードできます。

次のステップは、LONGおよびLONG RAWデータ型のアンロードの例を示します。

  1. アンロードする表にLONG列またはLONG RAW列が含まれる場合、外部表の対応する列を、LONG列に対してはCLOBを、LONG RAW列に対してはBLOBを定義します。
    SQL> CREATE TABLE long_tab
      2  (
      3    key                   SMALLINT,
      4    description           LONG
      5  );
    
    Table created.
    
    SQL> INSERT INTO long_tab VALUES (1, 'Description Text');
    
    1 row created.
    
  2. これで、LONG列からのデータを含めたCLOB列を含む外部表を作成できます。外部表をロードするときには、LONG列をCLOBに変換するためにTO_LOB演算子が使用されます。
    SQL> CREATE TABLE long_tab_xt
      2  ORGANIZATION EXTERNAL
      3  (
      4    TYPE ORACLE_DATAPUMP
      5    DEFAULT DIRECTORY def_dir1
      6    LOCATION ('long_tab_xt.dmp')
      7  )
      8  AS SELECT key, TO_LOB(description) description FROM long_tab;
    
    Table created.
    
  3. 外部表のデータを使用して、アンロードされている表と同じ表を別に作成できますが、作成した表にはLONG列のかわりにLOB列が含まれます。
    SQL> CREATE TABLE lob_tab
      2  AS SELECT * from long_tab_xt;
    
    Table created.
    
  4. 表が正しく作成されたことを確認します。
    SQL> SELECT * FROM lob_tab;
    
           KEY  DESCRIPTION
    ----------------------------------------------------------------------------
             1  Description Text

16.5.3 FINALオブジェクト型を含む列のアンロードおよびロード

FINAL型の列のオブジェクトは、オブジェクト型の各属性を外部表の列に移動することで移入されます。

また、外部表には、列オブジェクトがアトミックNULLであるかどうかを追跡するための、新規の列が必要です。次のステップでは、FINALオブジェクト型を含む列のアンロードおよびロードの方法を示します。

  1. 次の例では、ソース表のwarehouse列がアトミックNULLであるかを追跡するために外部表のwarehouse列を使用します。
    SQL> CREATE TABLE inventories_obj_xt
      2  ORGANIZATION EXTERNAL
      3  (
      4    TYPE ORACLE_DATAPUMP
      5    DEFAULT DIRECTORY def_dir1
      6    LOCATION ('inv_obj_xt.dmp')
      7  )
      8  AS
      9  SELECT oi.product_id,
     10         DECODE (oi.warehouse, NULL, 0, 1) warehouse,
     11         oi.warehouse.location_id location_id,
     12         oi.warehouse.warehouse_id warehouse_id,
     13         oi.warehouse.warehouse_name warehouse_name,
     14         oi.quantity_on_hand
     15  FROM oc_inventories oi;
    
    Table created.
    

    これで、オブジェクト型の属性を含む外部表の列を、その型の列をロードする際の型コンストラクタのファンクションの引数として使用できます。外部表のwarehouse列は、オブジェクトのコンストラクタ・ファンクションをコールするか、列をNULLに設定するかを判断するために使用されます。

  2. oc_inventoriesビューと同様の新規の内部表をロードします。(WHERE 1=0句を使用すると、古い表と同様の表を作成しますが、データは古い表から新しい表にはコピーされません。)
    SQL> CREATE TABLE oc_inventories_2 AS SELECT * FROM oc_inventories
    WHERE 1 = 0;
    
    Table created.
    
    SQL> INSERT INTO oc_inventories_2
      2  SELECT product_id,
      3         DECODE (warehouse, 0, NULL,
      4                 warehouse_typ(warehouse_id, warehouse_name,
      5                 location_id)), quantity_on_hand
      6  FROM inventories_obj_xt;
    
    1112 rows created.

16.5.4 FINALオブジェクト型の表

オブジェクト表には、表のすべての行を一意に識別するオブジェクト識別子があります。

そのため次のような問題があります。

  • オブジェクト識別子をアンロードおよび再ロードする必要がない場合、外部表にはオブジェクト表に対する型の属性のフィールドのみを含める必要があります。

  • オブジェクト識別子(OID)をアンロードおよび再ロードする必要があり、表のOIDが表の1つ以上のフィールドである場合(主キー・ベースOIDとも呼ばれる)、外部表には表の型のすべての属性に対して1つの列が存在します。

  • OIDをアンロードする必要があり、表のOIDがシステム生成である場合、手順はより複雑になります。システム生成OIDを保持するには、型の属性の他に別の列を作成する必要があります。

次のステップは、前述の最後の状況の例を示します。

  1. システム生成OIDを持つ型の表を作成します。

    SQL> CREATE TYPE person AS OBJECT (name varchar2(20)) NOT FINAL
      2  /
    
    Type created.
    
    SQL> CREATE TABLE people OF person;
    
    Table created.
    
    SQL> INSERT INTO people VALUES ('Euclid');
    
    1 row created.
    
  2. システム生成OIDを含む列を保持するために、OID列を使用する外部表を作成します。

    SQL> CREATE TABLE people_xt
      2  ORGANIZATION EXTERNAL
      3  (
      4    TYPE ORACLE_DATAPUMP
      5    DEFAULT DIRECTORY def_dir1
      6    LOCATION ('people.dmp')
      7  )
      8  AS SELECT SYS_NC_OID$ oid, name FROM people;
    
    Table created.
    
  3. システム生成OIDを持つ同じ型の別の表を作成します。次にINSERT文を実行して、新しい表に古い表からアンロードされたデータをロードします。

    SQL> CREATE TABLE people2 OF person;
    
    Table created.
    
    SQL> 
    SQL> INSERT INTO people2 (SYS_NC_OID$, SYS_NC_ROWINFO$)
      2  SELECT oid, person(name) FROM people_xt;
    
    1 row created.
    
    SQL> 
    SQL> SELECT SYS_NC_OID$, name FROM people
      2  MINUS
      3  SELECT SYS_NC_OID$, name FROM people2;
    
    no rows selected

16.6 ORACLE_DATAPUMPアクセス・ドライバを使用する際のパフォーマンスのヒント

このトピックでは、ORACLE_DATAPUMPアクセス・ドライバを使用する際のパフォーマンスのヒントについて説明します。

パフォーマンスを監視する場合、最も重要なことは、ロードの経過時間の測定です。また、CPU使用量、メモリー使用量およびI/O率の測定も重要です。

並列度を増減することによって、パフォーマンスを変更できます。並列度は、データ・ファイルの処理に起動できるアクセス・ドライバの数を示します。並列度によって、リソース使用率を低くした遅いロードと、すべてのリソースを使用した速いロードを選択できます。アクセス・ドライバは、アクセス・ドライバ専用に使用するリソース量を判断できないため、自動的にはチューニングされません。

アクセス・ドライバは、パフォーマンスを向上させるために大きなI/Oバッファを使用します。共有サーバーを使用するデータベースでは、アクセス・ドライバが使用するすべてのメモリーはSystem Global Area(SGA)から割り当てられます。そのため、共有サーバー上の外部表を使用する際には注意が必要です。

16.7 ORACLE_DATAPUMPアクセス・ドライバ使用時の制限事項

このトピックでは、ORACLE_DATAPUMPアクセス・ドライバの制限事項について説明します。

具体的には次のとおりです。

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

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

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

  • ロード時におけるバイト順序マークの処理。データ・ファイル文字セットがUTF8またはUTF16の外部表ロードでは、バイト順序マークの確認は抑止できません。バイト順序マークの確認は、データ・ファイルの先頭にバイト順序マークのエンコーディングと一致するバイナリ・データが含まれている場合にのみ抑止する必要があります。(SQL*Loaderを使用したロードでは、バイト順序マークの確認を抑止できます。)バイト順序マークを確認するということは、バイト順序マークがデータ・ファイル内に存在する必要があるという意味ではないことに注意してください。バイト順序マークがない場合は、サーバー・プラットフォームのバイト順序が使用されます。

  • 外部表機能では、文字列内のバックスラッシュ(\)エスケープ文字の使用をサポートしません。詳細は、「バックスラッシュ・エスケープ文字の使用」を参照してください。

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

16.8 ORACLE_DATAPUMPアクセス・ドライバの予約語

このトピックでは、ORACLE_DATAPUMPアクセス・ドライバの予約語について説明します。

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

  • BADFILE

  • COMPATIBLE

  • COMPRESSION

  • DATAPUMP

  • DEBUG

  • ENCRYPTION

  • INTERNAL

  • JOB

  • LATEST

  • LOGFILE

  • NOBADFILE

  • NOLOGFILE

  • PARALLEL

  • TABLE

  • VERSION

  • WORKERID