こんにちは、タイムスタンプ値を含むファイルを sqlldr でロードする際に問題が発生しました。タイムスタンプをロードするファイルの行は次のようになります: ..... 2014-09-02-00.00.00.
そして私のctrlファイル: ... ... Field POSITION(1085) TIMESTAMP )
すべてのレコードが次のエラーで拒否されます: ORA-26041: DATETIME/INTERVAL データ型変換エラー
こんにちは、タイムスタンプ値を含むファイルを sqlldr でロードする際に問題が発生しました。タイムスタンプをロードするファイルの行は次のようになります: ..... 2014-09-02-00.00.00.
そして私のctrlファイル: ... ... Field POSITION(1085) TIMESTAMP )
すべてのレコードが次のエラーで拒否されます: ORA-26041: DATETIME/INTERVAL データ型変換エラー
SQL*Loader は、デフォルトの NLS セッション パラメータを使用して、文字列をタイムスタンプとして解釈しようとします。デフォルトでは、次のようになります。
select value from nls_session_parameters where parameter = 'NLS_TIMESTAMP_FORMAT';
VALUE
--------------------------------------------------------------------------------
DD-MON-RR HH24.MI.SSXFF
...その設定がORA-01843を与えるので、あなたのものは別のもののように見えますが、例の文字列では有効な月ではありません。ロードのログ ファイルには、適用しようとした形式も表示されます。
Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
"<field>" 1085 * , DATETIME DD-MON-RR HH24.MI.SSXFF
デフォルトの形式が何であれ、ファイルの形式と一致していないようです。データベースの形式を変更したり、ログオン トリガーを使用したりすることはできますが、既存の形式を必要とする他のソースまたは出力がある場合は役に立ちません。また、別の環境では異なる可能性があるため、とにかく NLS 設定に依存しないでください。
フィールド定義の一部としてタイムスタンプ形式を指定できます。
... Field POSITION(1085) TIMESTAMP "YYYY-MM-DD-HH24.MI.SS")
列が (timestamp with time zone
タグによって提案されているが、質問によって提案されていない) 場合、セッションのタイム ゾーンに挿入されます。
位置範囲を指定する方が一般的ですが、これがレコードの最後のフィールドである場合は、開始位置 1085 を指定するだけで機能します。