簡述sqlldr的使用


     我的項目有一張表,始終是手動導入數據。我接手之前的同事總是喜歡用pl/sql developer,但是我覺得還是黑框框看着有技術含量。

     這里順便就寫一下有關sqlldr的簡單用法。

     有關sqlldr資料比較全面的應該就是幫助了,打出來看一下。

    

SQL*Loader: Release 11.2.0.1.0 - Production on 星期六 8月 4 12:54:31 2012

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.


用法: SQLLDR 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  (默認 NOT_USED)
columnarrayrows -- 直接路徑列數組的行數  (默認 5000)
streamsize -- 直接路徑流緩沖區的大小 (以字節計)  (默認 256000)
multithreading -- 在直接路徑中使用多線程
 resumable -- 啟用或禁用當前的可恢復會話  (默認 FALSE)
resumable_name -- 有助於標識可恢復語句的文本字符串
resumable_timeout -- RESUMABLE 的等待時間 (以秒計)  (默認 7200)
date_cache -- 日期轉換高速緩存的大小 (以條目計)  (默認 1000)
no_index_errors -- 出現任何索引錯誤時中止加載  (默認 FALSE)

PLEASE NOTE: 命令行參數可以由位置或關鍵字指定
。前者的例子是 'sqlldr
scott/tiger foo'; 后一種情況的一個示例是 'sqlldr control=foo
userid=scott/tiger'。位置指定參數的時間必須早於
但不可遲於由關鍵字指定的參數。例如,
允許 'sqlldr scott/tiger control=foo logfile=log', 但是
不允許 'sqlldr scott/tiger control=foo log', 即使
參數 'log' 的位置正確。

  好在我是中文版的oracle,看起來很明了。我的目的是把文本文件導入到數據庫中,因此我只需要幾個很簡單的參數。下面是我的數據文件的格式:

      xa0010011,88721,201207

      xa0010012,88722,201207

      ......

      下面是我的數據表的結構:

      create table sqlldr_test

      (

          user_no varchar2(100),

          user_rate number,

          month_id varchar2(6)

       )。

      那么,sqlldr的控制文件應該這樣寫:

     

load data
infile 'E:\Script\data.txt'
append
into table sqlldr_test
fields terminated by ','
trailing nullcols
(
    user_no,
    user_rate,
    month_id
)

      其中,append代表直接插入到隊尾。append什么原理,可以參考網絡資料。這個我個人認為可以提高導入的速度,因為數據直接插到了數據表的隊尾。另外還有參數:truncate,replace,insert,他們分別和truncate table,delete from table和insert into table對應,前兩個是要刪除數據的慎用。

      我的文本文件中,數據是用逗號“,”分割的,所以這里寫上了,這句一定要寫。

      trailing nullcols,代表表的字段沒有值時,允許為空。

      到此為止,控制文件的寫作就算完成了,已經可以滿足我的應用了。

      接下來就要用了。不管是在linux里,還是windows里,都是用命令行來控制的,當然了也可以寫一個程序控制,但是我不會。命令行的命令如下:

     

sqlldr wings/wings@OBAMA control=control.ctl log=log.log bad=bad.log errors=5000 rows=500

      這里面的所有參數在文章最開始的地方已經解釋過了,這里便不再贅述。下面點一下回車就執行了。
      我覺得需要說的應該就是rows了,因為從最開始接觸oracle就有人告訴我,每次插入數據的時候,最好每多少多少行提交一次,因為undo空間是有限的。至於每次使用sqlldr的時候多少行提交一次,我想應該根據自己的文件大小決定。

      記得記日志,不然錯了你都不知道錯到哪里了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM