使用sqlload匯入外部資料

we6100發表於2015-11-20
被匯入的表
SQL> desc emp_enc
Name  Type         Nullable Default Comments 
----- ------------ -------- ------- -------- 
ENAME VARCHAR2(10) Y                         
EMPNO NUMBER(4)    Y                         
SAL   NUMBER(7,2)  Y        

需要匯入的txt檔案,以逗號分隔
load.txt
aa,1,100
cc,2,222
dd,3,221
js,4,231
jdj,38,282892(這天記錄長度過長,所以待會會匯入失敗)

sqlload 控制檔案所要用到的引數

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             --要插入記錄的表
Fields terminated by ","      --資料中每行記錄用 "," 分隔
Optionally enclosed by '"'    --資料中每個欄位用 '"' 框起,比如欄位中有 "," 分隔符時
trailing nullcols                   --表的欄位沒有對應的值時允許為空
(
  virtual_column FILLER,    --這是一個虛擬欄位,用來跳過由 PL/SQL Developer 生成的第一列序號
  user_id number,           --欄位可以指定型別,否則認為是 CHARACTER 型別, log 檔案中有顯示
  user_name,
  login_times,
  last_login DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相當用 to_date() 函式轉換

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


根據上面的引數寫入到一個文字,(將原表truncate後,再插入)
LOAD DATA
INFILE 'D:\load.txt'
INTO TABLE test
TRUNCATE
fields terminated by ','
trailing nullcols 
(ENAME,EMPNO,SAL)

C:>sqlldr scott/tiger@ab control=D:\control.txt log=D:\log.txt bad=D:\load\bad.txt

SQL*Loader: Release 11.2.0.1.0 - Production on 星期五 11月 20 15:19:07 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
達到提交點 - 邏輯記錄計數 4
達到提交點 - 邏輯記錄計數 5

匯入成功,違規的記錄放在bad.txt裡
SQL> select * from emp_enc;
 
ENAME      EMPNO       SAL
---------- ----- ---------
aa             1    100.00
cc             2    222.00
dd             3    221.00
js             4    231.00

修改控制檔案,不請空原表,再匯入,會報錯

LOAD DATA
INFILE 'D:\load.txt'
INTO TABLE test
fields terminated by ','
trailing nullcols 
(ENAME,EMPNO,SAL)

SQL*Loader-601:  對於 INSERT 選項, 表必須為空。表 EMP_ENC 上出錯
需要修改控制檔案
LOAD DATA
INFILE 'D:\load.txt'
APPEND INTO TABLE testfields terminated by ','
trailing nullcols 
(ENAME,EMPNO,SAL)


sqlload的用法: sqlload keyword=value [,keyword=value,...]

有效的關鍵字:

    userid -- ORACLE 使用者名稱/口令
   control -- 控制檔名
       log -- 日誌檔名
       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  (預設 NO
T_USED)
columnarrayrows -- 直接路徑列陣列的行數  (預設 5000)
streamsize -- 直接路徑流緩衝區的大小 (以位元組計)  (預設 256000)
multithreading -- 在直接路徑中使用多執行緒
 resumable -- 啟用或禁用當前的可恢復會話  (預設 FALSE)
resumable_name -- 有助於標識可恢復語句的文字字串
resumable_timeout -- RESUMABLE 的等待時間 (以秒計)  (預設 7200)
date_cache -- 日期轉換快取記憶體的大小 (以條目計)  (預設 1000)
no_index_errors -- 出現任何索引錯誤時中止載入  (預設 FALSE) 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27500440/viewspace-1842094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章