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