0

こんにちは、タイムスタンプ値を含むファイルを sqlldr でロードする際に問題が発生しました。タイムスタンプをロードするファイルの行は次のようになります: ..... 2014-09-02-00.00.00.

そして私のctrlファイル: ... ... Field POSITION(1085) TIMESTAMP )

すべてのレコードが次のエラーで拒否されます: ORA-26041: DATETIME/INTERVAL データ型変換エラー

4

1 に答える 1

2

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 を指定するだけで機能します。

于 2014-09-23T08:31:52.293 に答える