オプションのCOLUMN TRANSFORMS句を使用した変換では、データ・ファイルの列に直接マップされない外部表の列をロードする方法を指定できます。column_transforms句の構文は次のようになります。
注意:
COLUMN TRANSFORMS句とPREPROCESSOR句を同時に使用することはできません。
transform句で指定された各変換では、外部表の列を識別し、次に列の値の計算方法を指定します。構文は次のとおりです:
NULL変換は、外部表の列を各行でNULLに設定します。CONSTANT変換は、外部表の列をすべての行で同じ値に設定するために使用されます。CONCAT変換は、外部表の列をデータ・ファイルからの現在のレコード内の定数文字列またはフィールド(あるいはその両方)の連結に設定するために使用されます。LOBFILE変換は、別のデータ・ファイルからのレコードのフィールドにデータをロードするために使用されます。これらの各変換については、次の項で詳しく説明します。
column_nameは、ロードする外部表の列を一意に識別します。transform句で列名が参照される場合、その名前は、データ・ファイルのフィールドとしてFIELDS句で指定することはできません。
CONSTANT変換では、レコードの列の値として指定された文字列の値が使用されます。外部表の列が文字列型でない場合、定数文字列は列のデータ型に変換されます。この変換は各行に対して行われます。
データ型変換で使用される文字列のキャラクタ・セットは、データベースのキャラクタ・セットです。
CONCAT変換は、データ・ファイルの定数文字列とフィールドを連結して1つの文字列にします。連結の一部として使用できるフィールドは、文字データ型でfields句にリストされているフィールドのみです。他の列変換は、連結の一部として指定できません。
LOBFILE変換は、外部表の列の値として内容を使用するファイルを識別します。すべてのLOBFILEは、directory object:filename形式のオプションのディレクトリ・オブジェクトおよびファイル名で識別されます。LOBFILE変換には次の規則が適用されます。
ディレクトリ・オブジェクトおよびファイル名は、定数文字列またはフィールド句のフィールド名のいずれかです。
定数文字列が指定された場合、その文字列を使用して表の各行のLOBFILEを検索します。
フィールド名が指定された場合、データ・ファイル内のそのフィールドの値を使用してLOBFILEを検索します。
ディレクトリ・オブジェクトまたはファイル名のいずれかに対してフィールド名が指定され、そのフィールドの値がNULLの場合、LOBFILEによってロードされる列もNULLに設定されます。
ディレクトリ・オブジェクトが指定されない場合、外部表に対して指定されたデフォルトのディレクトリが使用されます。
ディレクトリ・オブジェクトに対してフィールド名が指定された場合、FROM句も指定する必要があります。
ファイル全体がLOB列の値として使用されます。複数の行で同じファイルが参照されると、各列を移入するためにファイルが再びオープンし、再び読み込まれます。
lobfile_attr_listは、LOBFILEの追加属性をリストします。構文は次のとおりです:
FROM句は、LOBFILEで使用されるすべてのディレクトリ・オブジェクトの名前をリストします。LOBFILEの名前のディレクトリ・オブジェクトに対して、フィールド名が指定された場合にのみ使用します。FROM句の目的は、初期化時に名前付きのディレクトリ・オブジェクトに許可されたアクセス権の種類を識別することにあります。フィールドの値に指定されたディレクトリ・オブジェクトが、リスト内のディレクトリ・オブジェクトではない場合、行は拒否されます。
CLOB属性は、LOBFILE内のデータがRAWデータではなく、文字データであることを示します。場合によって文字データは、データベース内にLOBを格納するために使用されるキャラクタ・セットに変換する必要があります。
CHARACTERSET属性は、LOBFILE内のデータのキャラクタ・セット名を含みます。
BLOB属性は、LOBFILE内のデータが生データであることを示します。
CLOBまたはBLOBのいずれも指定されない場合、CLOBであるとみなされます。文字LOBFILEに対してキャラクタ・セットが指定されない場合、データ・ファイルのキャラクタ・セットであるとみなされます。
STARTOFキーワードを使用すると、列がソース・フィールドのデータの部分文字列になることが可能な外部表を作成できます。
長さは、部分文字列の先頭からの長さです。長さとはバイト数のことであり、変換される外部表の列は文字長セマンティクスではなく、バイト長セマンティクスを使用するとみなされます。(文字長セマンティクスを使用すると、予期しない結果になる可能性があります。)
完全な文字コードのみが移動され、文字は分割されません。したがって、部分文字列がマルチバイト・キャラクタの途中で終わると、結果の文字列は短くなります。たとえば、長さに10を指定し、10番目のバイトがマルチバイト・キャラクタの最初のバイトである場合、最初の9バイトのみが返されます。
次の例では、部署名(dname)フィールドの最初の4バイトのみが必要となる場合の、STARTOFキーワードの使用方法を示しています。
SQL> CREATE TABLE dept (deptno NUMBER(2),
2 dname VARCHAR2(14),
3 loc VARCHAR2(13)
4 )
5 ORGANIZATION EXTERNAL
6 (
7 DEFAULT DIRECTORY def_dir1
8 ACCESS PARAMETERS
9 (
10 RECORDS DELIMITED BY NEWLINE
11 FIELDS TERMINATED BY ','
12 (
13 deptno CHAR(2),
14 dname_source CHAR(14),
15 loc CHAR(13)
16 )
17 column transforms
18 (
19 dname FROM STARTOF dname_source (4)
20 )
21 )
22 LOCATION ('dept.dat')
23 );
Table created.
dept表からSELECT操作を実行する場合、dnameフィールドの最初の4バイトが返されます。
SQL> SELECT * FROM dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCO NEW YORK
20 RESE DALLAS
30 SALE CHICAGO
40 OPER BOSTON
4 rows selected.