Oracle--大資料遷移--sqlldr技術的應用
阿新 • • 發佈:2021-01-21
1. 讓表不產生REDO LOG
ALTER TABLE table_name nologging;
2.編寫控制檔案 *.ctl (重點)
如 0120.ctl
3.準備資料檔案
如 0120.csv
4. 在裝有oracle服務的Linux伺服器上執行
sqlldr db_user/db_pwd@//url:port/orcl control=0120.ctl direct=true ; 注意這裡的資料庫連線串是oracle 18c的寫法。
5. 執行結果
先使用 echo $? 回車,結果為0是成功;它也會生成日誌檔案檢視具體情況的
詳解0120.ctl的檔案內容(以下表欄位是原表的縮略版,刪除了不少欄位)
OPTIONS (skip=1,rows=5000,errors=0) -- sqlldr 命令顯示的選項可以寫到這裡邊來,skip=1 用來跳過資料中的第一行(第一行往往是表頭) unrecoverable -- 此選項必須要與DIRECT共同應用 LOAD DATA CHARACTERSET 'UTF8' --設定編碼 INFILE "0120.csv" --指定外部資料檔案 --INFILE "0121.csv" --若有多個數據檔案要以前執行,則按照本行的寫法繼續寫 --這裡還可以使 用 BADFILE、DISCARDFILE 來指定壞資料和丟棄資料的檔案, truncate --操作型別,truncate會清空表,還可以有 append 追加資料 INTO TABLE table_name -- 要插入記錄的表 Fields terminated by "," -- 資料中每行記錄用 "," 分隔 Optionally enclosed by '"' -- 資料中每個欄位用 '"' 框起,比如欄位中有 "," 分隔符時 trailing nullcols --表的欄位沒有對應的值時允許為空 ( -- virtual_column FILLER, --這是一個虛擬欄位,用來跳 過由 PL/SQL Developer 生成的第一列序號,若有則需要跳過該列,否則註釋掉 oid "sys_guid()" , -- 第一個主鍵欄位使用 oracle的uuid函式生成 instcode ,-- 預設是varchar型別的,預設最大支援255的長度,如果超長的自己要手動設長度 如 instcode char(1024), instname , name , idcard , phone , dayavginsuranceassets NULLIF (dayavginsuranceassets="") "to_number(:dayavginsuranceassets)" , --表字段number型別,手動呼叫oracle的to_number函式轉,當欄位為""時就是 NULL banktimepointassets NULLIF (banktimepointassets="") "to_number(:banktimepointassets)" , --表字段number型別,手動呼叫oracle的to_number函式轉,當欄位為""時就是 NULL enterpriseassetsratio , systime "sysdate" , --這裡使用系統預設生產時間,日期欄位也可以參考number型別,使用to_date("yyyy-MM-dd",:systime) updatetime "sysdate" , --這裡使用系統預設生產時間,日期欄位也可以參考number型別,使用to_date("yyyy-MM-dd",:updatetime) dayavgcurrentassets_total NULLIF (dayavgcurrentassets_total="") "to_number(:dayavgcurrentassets_total)" , --表字段number型別,手動呼叫oracle的to_number函式轉,當欄位為""時就是 NULL stat_date , stat_dd , city_code )
csv檔案