DEFAULTSパラメータを使用するデータのロード
Oracle Database 12c Release 2 (12.2) のSQL*LoaderにはDEFAULTSパラメーターが追加されました。このパラメーターはSQL*Loaderによるデータのロード時にテーブル列のDEFAULT設定をどのように評価するかを決定します。マニュアルを読むとDEFAULTSパラメーターは以下の値を指定することができます。「サポートされていないデフォルト値」が何を指すのかは不明です。
指定値 | 説明 |
---|---|
IGNORE | DEFAULTを評価しません。このため値は格納されません。 |
IGNORE_UNSUPPORTED_EVALUATE_ONCE | ロード開始時にデフォルト式を1回評価します。サポートされていないデフォルト値は無視されます。 |
IGNORE_UNSUPPORTED_EVALUATE_EVERY_ROW | ロード開始時にすべてのデフォルト式を評価します。サポートされていないデフォルト値は無視されます。 |
EVALUATE_ONCE | ロード開始時にデフォルト式を1回評価します。 |
EVALUATE_EVERY_ROW | ロード開始時にすべてのデフォルト式を評価します。 |
パラメーターを指定しない場合、DEFAULTが順序を参照しない場合はEVALUATE_ONCE、参照する場合はEVALUATE_EVERY_ROWになります。
マニュアルにある「順序を参照」はGENERATED AS IDENTITY列や、明示的にDEFAULT値にSEQUENCEオブジェクトを指定している場合を指すと思われます。
実行例
テーブルの準備
SYSTEIMESTAMPをDEFAULTとするテーブルを作成し、データをロードしてみます。
SQL> CREATE TABLE load1(c1 VARCHAR2(128), c2 TIMESTAMP DEFAULT SYSTIMESTAMP);
表が作成されました。
データの準備
テストにはDBA_OBJECTビューのOBJECT_NAME列のみを抜き出して使用します。
SQL> SPOOL load1.dat
SQL> SELECT OBJECT_NAME FROM DBA_OBJECTS;
SQL> SPOOL OFF
SQL*Loaderの実行
DEFAULTSパラメーターはDIRECTモードの場合に限り指定できるため、DIRECT=TRUEの設定を追加します。
EVALUATE_EVERY_ROW指定
$ sqlldr userid=scott/tiger control=load1.ctl direct=true defaults=EVALUATE_EVERY_ROW
SQL*Loader: Release 12.2.0.1.0 - Production on 月 4月 23 14:40:40 2018
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
使用パス: ダイレクト
ロードが完了しました - 論理レコード件数74464。
表LOAD1:
74464 行は正常にロードされました。
確認するログ・ファイル:
load1.log
ロードの詳細を参照してください。
実際に格納されたレコードを確認します。最大値、最小値を確認すると、異なるデータが格納されていることがわかります。またDISTINCT値を確認すると、745種類のデータが格納されていることがわかります。正しく動作しているようです。
SQL> SELECT MIN(c2), MAX(c2) FROM load1 ;
MIN(C2)
---------------------------------------------------------------------------
MAX(C2)
---------------------------------------------------------------------------
18-04-23 14:40:41.085373
18-04-23 14:40:41.441384
SQL> SELECT COUNT(DISTINCT c2) FROM load1;
COUNT(DISTINCTC2)
-----------------
745
EVALUATE_ONCE指定
マニュアルを信じると、EVALUATE_ONCEを指定すると、DEFAULT値はロード開始時に1回だけ評価されるように読めます。このためEVALUATE_ONCEを指定してSQL*Loaderを実行します。
$ sqlldr userid=scott/tiger control=load1.ctl direct=true defaults=EVALUATE_ONCE
SQL*Loader: Release 12.2.0.1.0 - Production on 月 4月 23 14:33:44 2018
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
使用パス: ダイレクト
ロードが完了しました - 論理レコード件数74464。
表LOAD1:
74464 行は正常にロードされました。
確認するログ・ファイル:
load1.log
ロードの詳細を参照してください。
実際に格納されたレコードを確認します。最大値、最小値を確認すると、なぜか異なるデータが格納されていることがわかります。またDISTINCT値を確認すると、29種類のデータが格納されていることがわかります。EVALUATE_ONCEを指定しても単一の値が格納されるわけではないことがわかります。
SQL> SELECT MAX(c2), MIN(c2) FROM load1 ;
MAX(C2)
---------------------------------------------------------------------------
MIN(C2)
---------------------------------------------------------------------------
18-04-23 14:33:45.086733
18-04-23 14:33:44.838263
SQL> SELECT COUNT(DISTINCT c2) FROM load1;
COUNT(DISTINCTC2)
-----------------
29
検証の結果、EVALUATE_ONCEを指定しても必ずしも単一の値がロードされるわけではないことがわかりました。マニュアルに記載された「ロード開始時」が何を指すかがカギとなりそうですが、現状では詳細は不明です。