LoginSignup
0
0

More than 5 years have passed since last update.

SQL*LoaderのDEFAULTSパラメーターを試す(Oracle Database 12c Release 2新機能)

Last updated at Posted at 2018-04-23

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を指定しても必ずしも単一の値がロードされるわけではないことがわかりました。マニュアルに記載された「ロード開始時」が何を指すかがカギとなりそうですが、現状では詳細は不明です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0