2

私はCSVファイルを持っています。csvファイルの中身を読み込みたいoracle database with SQLLDR.

私のSQLLDRは

@echo off
sqlldr black@user/password data=D:\csv\data.csv control=D:\ctl\loader.ctl log=D:\ctl    \loader.log bad=D:\ctl\loader.bad
pause

私のloader.ctlは

  OPTIONS (SKIP=1)
    LOAD DATA
    APPEND  
  INTO TABLE data2007
  FIELDS TERMINATED BY ',' TRAILING NULLCOLS
  ( number "TRIM (:number)",
    name "TRIM (:name)",
    total "TRIM (:total)",
  )

テーブル

CREATE TABLE DATA2007 (
    number      VARCHAR2(6),
    name        VARCHAR2(30),
    total       NUMBER NULL,
  )

私のdata.csv:

Number,name,Total
1,"Marlyn",2000
2,"Bobby",1000
3,"Rina",2000
4,"Robby,Mr",5000
5,"juliet,Mrs",5000

行 1、2、3 = 成功しましたが、行 4 と 5 は拒否されました。行 4 と 5 に問題があることはわかっています。4 つの列があります。

  1. この問題を解決するには?
  2. ロード中に「合計」フィールドの後に現在の日付を挿入できますか?
4

1 に答える 1

4

二重引用符の間のカンマがセパレータとしてではなく、値の一部として扱われるように、フィールドを区切る必要があります。

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS

これは実際には別の質問である必要がありますが、固定値をロードするには、列にデフォルト値を設定して制御ファイルでまったく指定しないようにするか、場合によってはDEFAULTIFそれをオーバーライドしたい場合はオプションで句を使用できます。または、単純に SQL 文字列を使用して値を取得します。テーブル定義を変更してload_dateフィールドを含めます (そして、最初の列名を予約語ではないからnumberに変更し、 type にします):idNUMBER

CREATE TABLE DATA2007 (
  id          NUMBER,
  name        VARCHAR2(30),
  total       NUMBER NULL,
  load_date   DATE
);

次に、制御ファイルは次のとおりです。

OPTIONS (SKIP=1)
  LOAD DATA
  APPEND
INTO TABLE data2007
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
( id "TRIM (:id)",
  name "TRIM (:name)",
  total "TRIM (:total)",
  load_date "SYSDATE"
)

元のデータ ファイルでそれを実行すると、次のようになります。

Total logical records skipped:          1
Total logical records read:             5
Total logical records rejected:         0
Total logical records discarded:        0

と:

SELECT * FROM data2007;

        ID NAME                                TOTAL LOAD_DATE
---------- ------------------------------ ---------- -------------------
         1 Marlyn                               2000 2013-08-21 09:37:38
         2 Bobby                                1000 2013-08-21 09:37:38
         3 Rina                                 2000 2013-08-21 09:37:38
         4 Robby,Mr                             5000 2013-08-21 09:37:38
         5 juliet,Mrs                           5000 2013-08-21 09:37:38

5 rows selected.
于 2013-08-21T08:11:22.983 に答える