Oracle sqlldr


當有大量資料要匯入資料庫時, 也可以選擇使用sqlldr工具來完成, 好處如下,

  • 如果是降級匯入資料(11g to 9i), 就沒辦法使用exp/imp完成
  • 使用insert語法, 資料量大時執行要很久


以前我都是很認命的自己寫 control file, 後來發現Oracle SQL Developer很人性化的可以產生control file和data file, 方法如下,

1. 登入Oracle SQL Developer後, 找到要處理的Table


2. 點右鍵選擇[匯出]功能

3. 設定相關欄位
  • 格式: 選擇loader
  • 分隔符號: 選擇資料要分隔的符號, 常用 pipe
  • 行結束字元: 每筆資料分隔(換行)的符號
  • 另存新檔: 使用loader時要選擇個別檔案, 因為會產生control file(ctl)和data file (ldr)

 

4. 下一步後, 如果需要限制資料條件, 則在對應的Table右方輸入Where條件

5. 下一步後, 按下完成就會開始產生檔案

6. Control File (*.ctl)
OPTIONS (ERRORS=50)
LOAD DATA
INFILE 'D:\ABC.ldr' "str '\r\n'"
APPEND
CONTINUEIF NEXT(1:1) = '#'
INTO TABLE "MYDB"."ABC"
FIELDS TERMINATED BY'|'
OPTIONALLY ENCLOSED BY '"' AND '"'
TRAILING NULLCOLS ( 
"ABC01" ,
"ABC02" ,
"ABC03" ,
"ABC04" ,
"ABC05" ,
"ABC06" ,
"ABC07" ,
"ABC08" ,
"ABC09" ,
"ABC10" ,
"ABC11" ,
"ABC12" ,
"ABC13" ,
"ABC14" ,
"ABC15" ,
"ABC16" ,
"ABC17" ,
"ABC18" ,
"ABC19" ,
"ABCDATE" DATE "DD-MON-RR" ,
"ABC20" )

7. Data File (*.ldr)
 "AAA"|"A01"||||"001"|||"1"|"S"|"Y"|"Y"|"N"|0|0|"Y"|"512"||"fff"|26-6月 -09||
 "BBB"|"B01"|||||||"1"|"S"|"Y"|"N"|"N"|0|0|"Y"|"589"||"44"|02-8月 -06||
 "CCC"|"C01"||||"002"|||"1"|"S"|"Y"|"Y"|"N"|0|0|"Y"|"ffg"||"alex"|01-11月-13||
 "DDD"|"D01"||||"052"|||"1"|"S"|"Y"|"Y"|"N"|0|0|"Y"|"sdf"||"123"|24-6月 -10||

8. 執行下列指令就可以匯入資料了
sqlldr userid/password@dbtnsname control=d:\aaa.ctl

** 指定control檔案路徑時記得要給完整的路徑
** control file中指定的data file路徑是依據匯出時選擇的路徑產生的, 如果檔案產生後有移動位置, 記得要改, 否則會找不到
** contorl file中會依據匯出的schema指預設匯入相同的schema, 如果要匯入不同schema記得要修改

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 例外控制(Exception Control)

Oracle 工作排程 DBMS_JOB 筆記