Oracle Database 18c の新機能であるインライン外部表機能を試してみました。
外部表オブジェクト
外部表(EXTERNAL TABLE)オブジェクトは、表領域に格納された通常のテーブルとは異なり、データベースの外部に保存されたファイル等をテーブルと同様のSELECT文で検索できるようにするオブジェクトです。通常はCSVファイル等を直接テーブルとして参照したい場合に使います。
これまでのバージョンの外部表はあらかじめ CREATE TABLE 文を使って作成する必要がありました。このため参照するファイル名やディレクトリ・オブジェクト名は固定されていました。
SQL> CREATE TABLE extern1
(
c1 NUMBER, c2
VARCHAR2(10)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY dir1
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY '|'
)
LOCATION ('data1-1.csv')
)
REJECT LIMIT UNLIMITED;
表が作成されました。
SQL> SELECT * FROM extern1;
C1 C2
---------- ----------
100 data1
200 data2
インライン外部表の作成
Oracle Database 18c では、あらかじめテーブルを作成せずに SELECT 文内に直接外部表のインターフェースを記述することができるようになりました。[こちら] (https://docs.oracle.com/cd/E96517_01/newft/new-features.html#GUID-7D707C76-4F3D-4AAE-B186-047217A36FB5) が新機能ガイドの記載です。
このためファイル名やディレクトリ名の指定を動的に記述することができます。下記は上記例と同じ処理を単一の文で実行しています。
SQL> SELECT * FROM EXTERNAL
(
(
c1 NUMBER,
c2 VARCHAR2(10)
)
TYPE ORACLE_LOADER
DEFAULT DIRECTORY dir1
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY '|'
)
LOCATION ('data1-1.csv')
REJECT LIMIT UNLIMITED
) extern1;
C1 C2
---------- ----------
100 data1
200 data2
制約
インライン外部表ではパーティション化を行うことができません。