オプションの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.