ORACLE_DATAPUMPアクセス・ドライバは、SQLのCREATE TABLE AS SELECT文を使用した外部表の作成の一環として、ダンプ・ファイルにデータを書き込むことができます。ファイル内のデータは、バイナリ形式で記述され、ORACLE_DATAPUMPアクセス・ドライバによってのみ読取りが可能です。作成されたダンプ・ファイルは変更できません(つまり、ダンプ・ファイルに対してデータ操作言語(DML)操作は実行できません)。ただし、このファイルは何回でも読み取ることができ、別の外部表のダンプ・ファイルとして同じデータベースまたは異なるデータベースで使用できます。
次の手順ではサンプル・スキーマoeを使用して、ORACLE_DATAPUMPアクセス・ドライバを使用したデータのアンロード方法およびロード方法の例を示します。(例では、ディレクトリ・オブジェクトdef_dir1がすでに存在し、ユーザーoeにはそれに対する読取りおよび書込み権限が付与されているとします。)
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.
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)
SQL> SELECT COUNT(*) FROM inventories_xt;
COUNT(*)
----------
1112
inventoriesのデータと比較します。違いがないことを確認します。SQL> SELECT * FROM inventories MINUS SELECT * FROM inventories_xt; no rows selected
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
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.
inventories表のデータと比較します。比較する前に、product_idフィールドは互換性のあるデータ型に変換されます。違いがないことを確認します。SQL> SELECT * FROM inventories MINUS SELECT * FROM inventories_xt2; no rows selected
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.
inventoriesを比較します。違いがないことを確認します。SQL> SELECT * FROM inventories MINUS SELECT * FROM inventories_xt3; no rows selected
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.
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.
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.
inventories表を比較します。違いがないことを確認します。これは、外部表の作成で使用された2つのダンプ・ファイルに同じメタデータ(同じ表名inv_part_xt、同じ列情報など)があるためです。SQL> SELECT * FROM inventories MINUS SELECT * FROM inv_part_all_xt; no rows selected



