1

csvファイルcreatedに値で呼び出される列があります。

2012-04-16 14:46:42
2012-06-16 12:40:52.653000000

これをSQLDeveloper3.1.07を使用してOracle11gR2にインポートしようとしています。

私はこれをフォーマットとして使用しています:RRRR-MM-DD HH24:MI:SS.FF

エラーが発生しますinput value not long enough for the date format

フォーマットをに変更するRRRR-MM-DD HH24:MI:SSとエラーが発生しますSQL Error: ORA-01830: date format picture ends before converting entire input string

どうすればいいですか?

4

1 に答える 1

3

いくつかの日付といくつかのタイムスタンプがあります。これは、データの整合性が低いシステムからデータをインポートする際の問題です。

2つのオプションがあります:インポートする前にデータをクリーンアップするか、インポート中にクリーンアップします。

事前にデータをクリーンアップするには、さまざまな方法があります。1つのオプションは、正規表現をサポートするテキストプロセッサまたはIDEを使用し、検索と置換を実行して、秒の小数部が不足している値を修正することです。

インポート中にクレンジングする最も簡単な方法は、(SQLローダーではなく)外部テーブルを仲介として使用することです。外部テーブルは非常に優れたオブジェクトであり、データベース内にあるかのようにOSファイル(CSVなど)の構造化データを操作できます。SQLローダーに対する外部テーブルの大きな利点は、DMLステートメントでそれらを使用できることです。 詳細をご覧ください

これを機能させるには、その列をvarchar2として使用して外部テーブルを定義する必要があります。また、文字列を取得してタイムスタンプに変換する関数を作成する必要があります。

 create or replace function fix_ts (str in varchar2)
      return timestamp
 is
      is_a_date exception;
      pragma exception_init(is_a_date, -1840);
      rv timestamp;
 begin
      begin
           rv := to_timestamp(str);
      exception
            when is_a_date then
                 rv := to_timestamp(str)||'.000000000';
      end;
      return rv;
 end;

次に、次のようにターゲットテーブルにレコードを挿入できます。

 insert into target_table
      (id, created, whatever)
 select id
         , fix_ts(created)
         , whatever
 from external_table; 

これが1回限りのデータクレンジングの演習である場合は、IDEでデータを変更する方がよいでしょう。これが通常のデータフィードである場合は、より自律的で堅牢なものを構築する価値があります。


あなたのコメントによると、3番目のオプションがあります:エクスポートプロセス中にデータを修正するためにソースシステムを取得することです。これは、多くの要因に応じて、簡単な場合と難しい場合があります。多くの場合、政治的な問題は技術的な問題よりも解決が困難です。

于 2012-07-21T20:18:57.897 に答える