SQL文字列を使用することによって、様々なSQL演算子をフィールド・データに適用できます。SQL文字列には、任意に組み合せたSQL式を組み込むことができます。ただし、このSQL式は、Oracle DatabaseによってINSERT
文中のVALUES
句に対して有効であると認識されたものにかぎります。通常、ターゲット列のデータ型と互換性のある単一の値を返すSQL関数を使用できます。SQL文字列は、列オブジェクトおよびコレクションなどのユーザー定義の複合型に加えて、単純なスカラー列型にも適用できます。
列名とSQL文字列のバインド変数における列名は、SQL識別子のルールによる解釈の結果、同じ列に対応している必要があります。ただし、次の例に示すとおり、2つの名前を完全に同じ記述にする必要はありません。
LOAD DATA INFILE * APPEND INTO TABLE XXX ( "Last" position(1:7) char "UPPER(:\"Last\")" first position(8:15) char "UPPER(:first || :FIRST || :\"FIRST\")" ) BEGINDATA Grant Phil Taylor Jason
前述の例では、次のことに注意してください。
表の作成時、(前述の"Last"
という列のように)列識別子に小文字または特殊文字(あるいはその両方)が含まれているために二重引用符を使用して宣言されている場合、バインド変数の列名は、CREATE TABLE
文で使用される列名と完全に一致する必要があります。
表の作成時、(前述のfirst
という列のように)列識別子が二重引用符を使用しないで宣言されている場合は、first
、FIRST
および"FIRST"
のすべてが大文字として処理され、FIRST
に解決されるため、SQL文字列のバインド変数では、これらのいずれの書式も使用できます。
SQL文字列を使用する場合は、次のことに注意してください。
SQL文字列の実行は、フィールド設定の一部としてみなされません。SQL文字列を実行する場合、フィールド設定およびNULLIF
やDEFAULTIF
句の結果が使用されます。したがって、評価の順序は次のとおりです(手順1と2は「WHEN、NULLIFおよびDEFAULTIF句の使用」で説明されている手順の要約です)。
フィールド設定が実行されます。
NULLIF
またはDEFAULTIF
句が適用されます(これにより、このような句が含まれるフィールドのフィールド設定の結果が変更されることがあります)。NULLIF
およびDEFAULTIF
句をSQL式で使用すると、FINAL型の列の結果ではなく、フィールド設定の結果に影響があります。
SQL式は、手順1と2の終了後に得られたフィールドの結果を使用して評価されます。結果は、SQL式を含む列に従って割り当てられます。(SQL式が存在しない場合、手順1と2から得られた結果が列に割り当てられます。)
関連付けられたSQL文字列を含む文字入力が制御ファイルによって指定されている場合、SQL*Loaderによるデータ変更は試行されません。これは、SQL*Loaderでは、SQL演算子を使用して変更した文字入力データは、データベースの挿入に対し正しい結果を生成すると仮定されているためです。
SQL文字列を指定する位置は、その列に関するその他の指定がすべて記述された後になります。
SQL文字列は、二重引用符で囲んで記述します。
SQL文字列内の列名を引用符で囲むには、エスケープ文字を使用する必要があります。
前述の例では、Last
を二重引用符で囲んで大文字および小文字の組合せを保持しています。また、二重引用符を使用すると、バックスラッシュ(エスケープ)文字も使用する必要があります。
SQL文字列に列オブジェクト属性を参照する列名が含まれている場合は、バインド変数にオブジェクト属性をフルネームで指定する必要があります。フルネームの各属性名は、個々の識別子です。各識別子は、SQL識別子の引用符ルールに従い、フルネームの他の識別子からは独立しています。たとえば、"HEIGHT_%TILE"
という名前の属性を持つCHILD
という列オブジェクトがあるとします。(その属性名は、二重引用符で囲まれています。)バインド変数にオブジェクト属性をフルネームで指定するには、次のいずれかの書式を使用します。
:CHILD.\"HEIGHT_%TILE\"
:child.\"HEIGHT_%TILE\"
フルネームを引用符で囲む(:\"CHILD.HEIGHT_%TILE\"
)と、バインド変数で使用されるオブジェクト属性名の引用符ルールは変更されたという警告メッセージが生成されます。この警告は、バインド変数を正確に指定するように求めるためのものであり、ロードが異常終了することはありません。名前を引用符で囲むと、SQLでは、名前が複数の識別子で構成される列オブジェクト属性フルネームとしてではなく、1つの識別子として解釈されるため、引用符ルールは変更されました。
SQL文字列の評価は、NULLIF
句またはDEFAULTIF
句の後、日時マスクよりも前に行われます。
Oracle Databaseで文字列を認識できない場合は、エラーが発生してロードは終了します。文字列が認識されても、データベース・エラーが発生すると、エラーの発生した行は拒否されます。
フィールド指定でEXPRESSION
パラメータを使用する場合は、SQL文字列が必要です。
SQL文字列では、OID
、SID
、REF
またはBFILE
を使用してロードしたフィールドは参照できません。また、FILLERフィールドやSQL文字列を使用する他のフィールドも参照できません。
ダイレクト・パス・モードでは、SQL文字列でのVARRAY
、ネストした表またはLOB列の参照はできません。これには、列オブジェクトの属性であるVARRAY
、ネストした表またはLOB列も含まれます。
SQL文字列は、RECNUM
、SEQUENCE
、CONSTANT
またはSYSDATE
フィールドでは使用できません。
SQL文字列は、LOB、BFILE
、XML
列またはコレクションの要素であるファイルでは使用できません。
ダイレクト・パス・モードでは、SQL文字列の式の評価後に返される最後の結果はスカラー・データ型である必要があります。つまり、ダイレクト・パス・ロードの実行時、式によってはオブジェクトまたはコレクション・データ型を返さない場合があります。