オブジェクト表のロードに必要な制御ファイルの構文は、典型的なリレーショナル表のロードの場合とほぼ同じです。例11-10に、主キーベースのオブジェクト識別子(OID)を使用したオブジェクト表のロード例を示します。
例11-10 主キーOIDを使用したオブジェクト表のロード
制御ファイルの内容
LOAD DATA INFILE 'sample.dat' DISCARDFILE 'sample.dsc' BADFILE 'sample.bad' REPLACE INTO TABLE employees FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (name CHAR(30) NULLIF name=BLANKS, age INTEGER EXTERNAL(3) NULLIF age=BLANKS, emp_id INTEGER EXTERNAL(5))
データ・ファイル(sample.dat)
Johny Quest, 18, 007, Speed Racer, 16, 000,
前述の制御ファイルを見ただけでは、ロードされる表がシステム生成OIDを持つオブジェクト表か、主キーOIDを持つオブジェクト表か、またはリレーショナル表かを判断できません。
すでにシステム生成OIDを含むデータをロードし、新しいOIDを生成するのではなく、データ・ファイル内の既存のOIDを使用するように指定する必要がある場合もあります。そのような場合は、INTO
TABLE
句に続けてOID
句を使用します。
OID (fieldname)
この場合、fieldname
には、システム生成OIDを含むデータ・フィールドにマップされた、フィールド指定リストのフィールド名(通常はFILLERフィールド)を指定します。SQL*Loaderでは、その指定されたOIDが、正しい形式で、グローバルな独自性を保持したOIDであるとみなされます。そのため、OracleのOIDジェネレータを使用してOIDを生成し、ロードされたOIDの一意性を確保する必要があります。
また、そのOID
句は、主キーOIDではなく、システム生成のOIDでのみ使用できます。
例11-11に、行オブジェクトを使用したシステム生成OIDのロード例を示します。
例11-11 OIDのロード
制御ファイルの内容
LOAD DATA INFILE 'sample.dat' INTO TABLE employees_v2 1 OID (s_oid) FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (name CHAR(30) NULLIF name=BLANKS, age INTEGER EXTERNAL(3) NULLIF age=BLANKS, emp_id INTEGER EXTERNAL(5), 2 s_oid FILLER CHAR(32))
データ・ファイル(sample.dat)
3 Johny Quest, 18, 007, 21E978406D3E41FCE03400400B403BC3,
Speed Racer, 16, 000, 21E978406D4441FCE03400400B403BC3,
注意:
例の左に付けた太字の数字は、次の注意事項と対応しています。
OID
句には、s_oid
のロード・フィールドがOIDを含むように指定します。カッコが必要です
s_oid
に有効な16進数が含まれていない場合、そのレコードは拒否されます。
データ・ファイルのOIDは文字列で、32バイトの16進数として解釈されます。32バイトの16進数は、後で16バイトのRAW
に変換されてオブジェクト表に格納されます。