1. 程式人生 > 其它 >oracle 使用sqlload匯入外部資料

oracle 使用sqlload匯入外部資料

使用SQLload大批量匯入資料

第一步:建立表

  CREATE TABLE "TESTHT"."DEMO" 
   (	
   "ID" VARCHAR2(20 BYTE) NOT NULL ENABLE, 
	"NAME" VARCHAR2(20 BYTE), 
	"AGE" VARCHAR2(20 BYTE)
   ) 

第二步 : 編寫sqlload匯入資料的控制檔案

這裡測試的控制檔案如下,可以根據自己需要新增相關的控制引數,測試的話複製儲存為txt檔案即可!

建立控制檔案 : /home/demo.ctl
內容如下:

OPTIONS (rows=1024)
LOAD DATA
CHARACTERSET ZHS16GBK  -- 這裡不加的話,可能中文亂碼
INFILE '/home/demo.txt'
truncate 
INTO TABLE DEMO
Fields terminated by ","
Optionally enclosed by '"'
trailing nullcols
(
  ID,
  NAME,
  AGE
)

控制檔案還有其他引數,根據自己需求調整和測試:
附部分控制引數:具體用法以官方文件為準

OPTIONS (skip=1,rows=128) 	-- sqlldr 命令顯示的選項可以寫到這裡邊來,skip=1 用來跳過資料中的第一行
LOAD DATA
INFILE "users_data.csv" 	--指定外部資料檔案,可以是不同格式的資料檔案,如csv、txt都支援  可以寫多個 INFILE "another_data_file.csv" 指定多個數據檔案
truncate 					--操作型別,用 truncate table 來清除表中原有記錄,根據情況而定是否需要清楚原有表中資料
INTO TABLE users			--要插入記錄的表
when  user_id<>'1'		 -- 還可以用 when 子 句選擇匯入符合條件的記錄  
Fields terminated by ","      --資料中每行記錄用 "," 分隔
Optionally enclosed by '"'    --資料中每個欄位用 '"' 框起,比如欄位中有 "," 分隔符時
trailing nullcols 			 --表的欄位沒有對應的值時允許為空
(
  virtual_column FILLER,    --這是一個虛擬欄位,用來跳過由 PL/SQL Developer 生成的第一列序號
  user_id number,              --欄位可以指定型別,否則認為是 CHARACTER 型別, log 檔案中有顯示
  username "'Hi '||upper(:username)",--,還能用SQL函式或運算對資料進行加工處理  
  logintimes terminated by ","  NULLIF (logintimes='NULL') --可為列單獨指定分隔符  
  last_login DATE "YYYY-MM-DD HH24:MI:SS" NULLIF (last_login="NULL") --當欄位為"NULL"時就是 NULL
) 

insert --為預設方式,在資料裝載開始時要求表為空
append --在表中追加新記錄
replace --刪除舊記錄(用 delete from table 語句),替換成新裝載的記錄
truncate --刪除舊記錄(用 truncate table 語句),替換成新裝載的記錄

第三步 : 建立需要匯入的資料

注意資料格式必須和表結構嚴格對應,否則匯入失敗!測試資料如下:有部分資料最後欄位為空,所以控制檔案中需要加trailing nullcols 引數!**

建立資料檔案 : /home/demo.txt

"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",
"2019-01-20","李思","23",

第四步 : 執行

我的資料檔案資料是300萬條記錄, 經測試執行時間大概在7s左右, 常規匯入可以通過使用 INSERT語句來匯入資料。Direct匯入可以跳過資料庫的相關邏輯(DIRECT=TRUE),而直接將資料匯入到資料檔案中,可以提高匯入資料的 效能。當然,在很多情況下,不能使用此引數(如果主鍵重複的話會使索引的狀態變成UNUSABLE!)。

[oracle@HM311 home]$ sqlldr testht/123456 control=/home/demo.ctl  data=/home/demo.txt  direct=true;
	.......
Commit point reached - logical record count 2999760
Commit point reached - logical record count 2999824
Commit point reached - logical record count 2999888
Commit point reached - logical record count 2999952
Commit point reached - logical record count 2999999
Commit point reached - logical record count 3000000

sqlLoad語法結構:

userid -- ORACLE 使用者名稱/口令          
control -- 控制檔名                  
log -- 記錄匯入時的日誌檔案,預設為 控制檔案(去除副檔名).log                      
bad -- 壞資料檔案,預設為 控制檔案(去除副檔名).bad                     
data --  資料檔案,一般在控制檔案中指定。用引數控制檔案中不指定資料檔案更適於自動操作                    
discard -- 廢棄檔名  
discardmax -- 允許廢棄的檔案的數目         (全部預設)  
skip -- 要跳過的邏輯記錄的數目  (預設 0)  
load -- 要載入的邏輯記錄的數目  (全部預設)  
errors -- 允許的錯誤記錄數,可以用他來控制一條記錄都不能錯        (預設 50)  
rows -- 常規路徑繫結陣列中或直接路徑儲存資料間的行數  (預設: 常規路徑 64, 所有直接路徑)  
bindsize -- 常規路徑繫結陣列的大小 (以位元組計)  (預設 256000)  
silent -- 執行過程中隱藏訊息 (標題,反饋,錯誤,廢棄,分割槽)  
direct -- 使用直接路徑                     (預設 FALSE)  
parfile -- 引數檔案: 包含引數說明的檔案的名稱  
parallel -- 執行並行載入                    (預設 FALSE)  
file -- 要從以下物件中分配區的檔案       
skip_unusable_indexes -- 不允許/允許使用無用的索引或索引分割槽  (預設 FALSE)  
skip_index_maintenance -- 沒有維護索引, 將受到影響的索引標記為無用  (預設 FALSE)  
commit_discontinued -- 提交載入中斷時已載入的行  (預設 FALSE)  
readsize -- 讀取緩衝區的大小               (預設 1048576)  
external_table -- 使用外部表進行載入; NOT_USED, GENERATE_ONLY, EXECUTE  (預設 NOT_USED)  
columnarrayrows -- 直接路徑列陣列的行數  (預設 5000)  
streamsize -- 直接路徑流緩衝區的大小 (以位元組計)  (預設 256000)  
multithreading -- 在直接路徑中使用多執行緒  
resumable -- 啟用或禁用當前的可恢復會話  (預設 FALSE)  
resumable_name -- 有助於標識可恢復語句的文字字串  
resumable_timeout -- RESUMABLE 的等待時間 (以秒計)  (預設 7200)  
date_cache -- 日期轉換快取記憶體的大小 (以條目計)  (預設 1000)  
no_index_errors -- 出現任何索引錯誤時中止載入  (預設 FALSE)本文來自:雨花石,原地址:https://www.yuhuashi.infohttps://www.yuhuashi.info/post/121.html

當載入大量資料時(大約超過10GB),最好抑制日誌的產生:

SQL>ALTER   TABLE   DEMO nologging;