プライマリ・コンテンツに移動
Oracle® Databaseユーティリティ
12cリリース1 (12.1.0.2)
B71303-09
目次へ移動
目次
索引へ移動
索引

前
次

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