次の説明は、スカラー・フィールドに適用されます。非スカラー・フィールド(列オブジェクト、LOBおよびコレクション)はより複雑なため、WHEN
、NULLIF
およびDEFAULTIF
句は異なる方法で処理されます。
WHEN
、NULLIF
またはDEFAULTIF
句は、フィールド名を指定するか、フィールド位置を指定するかによって、結果が異なります。
WHEN
、NULLIF
またはDEFAULTIF
句でフィールド名を指定すると、これらの句は、SQL*Loaderによってフィールドの評価値と比較されます。評価値には、切り捨てられた空白文字が考慮されます。空白およびタブの切捨ての詳細は、「空白の切捨て」を参照してください。
WHEN
、NULLIF
またはDEFAULTIF
句で位置を指定すると、これらの句は、SQL*Loaderによってデータ・ファイル内の元の論理レコードと比較されます。この場合、論理レコードでは空白の切捨ては行われません。
フィールドに切り捨てられた空白がある場合、あるいはWHEN
、NULLIF
またはDEFAULTIF
句に空白およびタブが含まれているか、BLANKS
パラメータが使用されている場合は、異なる結果が得られます。名前で指定されているフィールドおよび位置で指定されているフィールドに対して同じ結果が必要な場合は、PRESERVE
BLANKS
オプションを使用します。PRESERVE
BLANKS
オプションによって、フィールド値の評価時にSQL*Loaderによって空白文字が切り捨てられないようにします。
WHEN
、NULLIF
またはDEFAULTIF
句は、SQL*Loaderの処理手順によっても結果に影響します。SQL*Loaderは次の手順を順番に実行します。ただし、すべての手順を実行するわけではありません。フィールドが設定されると、設定作業の残りの手順は無視されます。たとえば、手順5でフィールドが設定された場合、SQL*Loaderは手順6には進みません。
SQL*Loaderで、入力レコードの各フィールドの値が評価され、空白およびタブの切り捨てに関する既存のガイドラインに従って、切り捨てる必要のある空白が切り捨てられます。
各レコードに対して、SQL*Loaderで表のWHEN
句が評価されます。
レコードが表のWHEN
句を満たす場合、またはWHEN
が指定されていない場合は、SQL*Loaderで、NULLIF
句の各フィールドが確認されます。
NULLIF
句が存在する場合は、SQL*Loaderで評価されます。
NULLIF
句が満たされている場合は、SQL*LoaderではフィールドがNULL
に設定されます。
NULLIF
句が満たされていない場合、またはNULLIF
句がない場合は、SQL*Loaderのフィールド評価によってフィールド長が確認されます。フィールドがフィールド評価の結果、0の長さを持っている場合(たとえば、NULLフィールドまたは結果としてNULLフィールドとなる空白の切捨て)は、SQL*LoaderでフィールドがNULL
に設定されます。この場合、フィールドに指定されたDEFAULTIF
句は評価されません。
指定されたNULLIF
句が偽の場合、またはNULLIF
句がない場合、およびフィールドがフィールド評価の結果、0の長さを持たない場合は、SQL*Loaderで、DEFAULTIF
句に対するフィールドが確認されます。
DEFAULTIF
句が存在する場合は、SQL*Loaderで評価されます。
DEFAULTIF
句が満たされていて、データ・ファイルのフィールドが数値フィールドの場合、フィールドは0に設定されます。フィールドが数値フィールドではない場合、NULL
に設定されます。次のフィールドは数値フィールドで、DEFAULTIF
句を満たす場合は、0に設定されます。
BYTEINT
SMALLINT
INTEGER
FLOAT
DOUBLE
ZONED
(パック)DECIMAL
数値型 EXTERNAL
(INTEGER
、FLOAT
、DECIMAL
およびZONED
)
DEFAULTIF
句が満たされていない場合、またはDEFAULTIF
句がない場合は、SQL*Loaderによって、手順1の評価値でフィールドが設定されます。
SQL*Loaderの操作順序が原因で、予期しない結果となる場合があります。たとえば、DEFAULTIF
句は、数値フィールドを0ではなくNULL
に設定しているように見える場合があります。
注意:
これらの手順に示したとおり、NULLIF
およびDEFAULTIF
句を使用した場合は、SQL*Loaderによる処理が増えます。そのためパフォーマンスに影響する可能性があります。手順1では、0と評価されたフィールドは、SQL*LoaderによってNULL値に設定されます。パフォーマンスを向上させるには、この機能を利用するためにデータを変更できるかどうかを検討してください。手順1でのNULL値の検出は、NULLIF
句またはDEFAULTIF
句の処理よりはるかに迅速に行われます。
たとえば、CHAR(5)
は、論理レコードの終わりまでに格納されない場合、またはすべての空白が含まれ、空白の切捨てが有効になっている場合は、データ長が0になります。デリミタで区切られたフィールドは、フィールドの開始と終了記号の間に文字がない場合、データ長が0になります。
また、文字フィールドの場合は、通常、NULLIF
の方がDEFAULTIF
より迅速に処理されます(文字フィールドのデフォルト値はNULLです)。
関連項目: