オブジェクト表の列オブジェクトがNOT FINALに基づいている場合、SQL*Loaderによって導出サブタイプをオブジェクト表にロードできます。前述のとおり、オブジェクト表に導出サブタイプをロードする場合に必要な構文は、典型的なリレーショナル表のロードの場合とほぼ同じです。ただし、この場合、実際に使用するサブタイプがオブジェクト表で有効であるかどうかをSQL*Loaderで判断できるように、サブタイプに名前を指定する必要があります。この概念を例11-12に示します。
例11-12 サブタイプを使用したオブジェクト表のロード
オブジェクトの型定義
CREATE TYPE employees_type AS OBJECT (name VARCHAR2(30), age NUMBER(3), emp_id NUMBER(5)) not final; CREATE TYPE hourly_emps_type UNDER employees_type (hours NUMBER(3)); CREATE TABLE employees_v3 of employees_type;
制御ファイルの内容
LOAD DATA INFILE 'sample.dat' INTO TABLE employees_v3 1 TREAT AS hourly_emps_type FIELDS TERMINATED BY ',' (name CHAR(30), age INTEGER EXTERNAL(3), emp_id INTEGER EXTERNAL(5), 2 hours INTEGER EXTERNAL(2))
データ・ファイル(sample.dat)
Johny Quest, 18, 007, 32, Speed Racer, 16, 000, 20,
注意:
例の左に付けた太字の数字は、次の注意事項と対応しています。
TREAT
AS
句で指定すると、SQL*Loaderでは、実際の宣言型がemployee_type
であるオブジェクト表が、hourly_emps_type
型であると宣言されたかのように処理されます
hours
属性はhourly_emps_type
の属性であるため、ここで使用できます。TREAT
AS
句が指定されていない場合、この属性はオブジェクト表の宣言型の属性ではないため、エラーが発生します。