熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

數據批量導入Oracle數據庫

2013-11-13 22:14:24  來源: Oracle 

  SQL*LOADER是大型數據
倉庫選擇使用的加載方法因為它提供了最快速的途徑(DIRECTPARALLEL)現在我們拋開其理論不談用實例來使
您快速掌握SQL*LOADER的使用方法
  首先我們認識一下SQL*LOADER
  在NT下SQL*LOADER的命令為SQLLDR在UNIX下一般為sqlldr/sqlload
  如執行d:\oracle>sqlldr
SQL*Loader: Release Production on 星期二 ::
(c) Copyright Oracle Corporation  All rights reserved

  用法: SQLLOAD 關鍵字 = 值 [keyword=value]
有效的關鍵字:
    userid ORACLE username/password
   control Control file name
       log Log file name
       bad Bad file name
      data Data file name
   discard Discard file name
discardmax Number of discards to allow        (全部默認)
      skip Number of logical records to skip  (默認)
      load Number of logical records to load  (全部默認)
    errors Number of errors to allow          (默認)
      rows Number of rows in conventional path bind array or between direct p
ath data saves
(默認: 常規路徑 所有直接路徑)
  bindsize Size of conventional path bind array in bytes(默認)
    silent Supdivss messages during run (headerfeedbackerrorsdiscardspart
itions)
    direct use direct path                    (默認FALSE)
   parfile parameter file: name of file that contains parameter specification
s
  parallel do parallel load                   (默認FALSE)
      file File to allocate extents from
skip_unusable_indexes disallow/allow unusable indexes or index partitions(默認FALSE)
skip_index_maintenance do not maintain indexes mark affected indexes as unusable(默認FALSE)
commit_discontinued commit loaded rows when load is discontinued(默認FALSE)
  readsize Size of Read buffer                (默認)
PLEASE NOTE: 命令行參數可以由位置或關鍵字指定
前者的例子是 sqlload scott/tiger foo;
後者的例子是 sqlload control=foo userid=scott/tiger
位置指定參數的時間必須早於但不可遲於由關鍵字指定的參數例如
SQLLOAD SCott/tiger control=foo logfile=log
不允許 sqlload scott/tiger control=foo log
即使允許參數 log 的位置正確
d:\oracle>
      我們可以從中看到一些基本的幫助信息這裡我用到的是中文的WIN ADV SERVER
  我們知道SQL*LOADER只能導入純文本所以我們現在開始以實例來講解其用法
  已存在數據源resultcsv欲倒入ORACLE中FANCY用戶下
    resultcsv內容
  默認 Web 站點::RUNNING
  other::STOPPED
  third::RUNNING
  從中我們看出分別以逗號分隔為變長字符串
  制定控制文件resultctl
        resultctl內容
load data
infile resultcsv
into table resultxt
(resultid char terminated by
website char terminated by
ipport char terminated by
status char terminated by whitespace)
  說明
  infile 指數據源文件 這裡我們省略了默認的 discardfile resultdsc  badfile  resultbad
  into table resultxt 默認是INSERT也可以into table resultxt APPEND為追加方式或REPLACE
  terminated by  指用逗號分隔
  terminated by whitespace 結尾以空白分隔
  此時我們執行加載
D:\>sqlldr userid=fancy/testpass control=resultctl log=resulthisout
SQL*Loader: Release Production on 星期二 ::
(c) Copyright Oracle Corporation  All rights reserved
SQL*Loader:  在描述表RESULTXT時出現錯誤
ORA: 對象 RESULTXT 不存在
  提示出錯因為數據庫沒有對應的表
  在數據庫建立表
   create table resultxt
  (resultid varchar()
   website varchar()
   ipport varchar()
   status varchar())
/
  重新執行加載
  D:\>sqlldr userid=fancy/kill control=resultctl log=resulthisout
SQL*Loader: Release Production on 星期二 ::
(c) Copyright Oracle Corporation  All rights reserved
達到提交點邏輯記錄計數
達到提交點邏輯記錄計數
  已經成功!我們可以通過日志文件來分析其過程resulthisout內容如下
SQL*Loader: Release Production on 星期二 ::
(c) Copyright Oracle Corporation  All rights reserved
控制文件: resultctl
數據文件: resultcsv
錯誤文件: resultbad
廢棄文件: 未作指定
:
(可廢棄所有記錄)
裝載數: ALL
跳過數:
允許的錯誤:
綁定數組: 最大 字節
繼續:    未作指定
所用路徑:       常規
表RESULTXT
已載入從每個邏輯記錄
插入選項對此表INSERT生效
   列名                        位置      長度  中止 包裝數據類型

RESULTID                            FIRST     *          CHARACTER           
WEBSITE                              NEXT     *          CHARACTER           
IPPORT                               NEXT     *          CHARACTER           
STATUS                               NEXT     *  WHT      CHARACTER           

  表RESULTXT:
行載入成功
由於數據錯誤 行沒有載入
由於所有 WHEN 子句失敗 行沒有載入
由於所有字段都為空的 行沒有載入

  為結合數組分配的空間:    字節(行)
除綁定數組外的內存空間分配:         字節
跳過的邏輯記錄總數:       
讀取的邏輯記錄總數:       
拒絕的邏輯記錄總數:       
廢棄的邏輯記錄總數:       
從星期二 月  :: 開始運行
在星期二 月  :: 處運行結束
經過時間為: : :
CPU 時間為: : : (可
  並發操作
  sqlldr userid=/ control=resultctl direct=true parallel=true
   sqlldr userid=/ control=resultctl direct=true parallel=true
   sqlldr userid=/ control=resultctl direct=true parallel=true
    當加載大量數據時(大約超過GB)最好抑制日志的產生
  SQL>ALTER TABLE RESULTXT nologging;
    這樣不產生REDO LOG可以提高效率然後在CONTROL文件中load data上面加一行unrecoverable
    此選項必須要與DIRECT共同應用
  在並發操作時ORACLE聲稱可以達到每小時處理GB數據的能力!其實估計能到G就算不錯了開始可用結構
    相同的文件但只有少量數據成功後開始加載大量數據這樣可以避免時間的浪費

  我的示例
在數據庫建立表格weather如下
create table weather(
outlook varchar()
temperature float
humidity float
windy varchar()
play varchar()
)
在F盤建立兩個文件 分別如下
#resultctl內容如下
load data
infile resultcsv
into table weather
(outlook char terminated by
 temperature  char terminated by
 humidity char terminated by
 windy char terminated by
 play char terminated by
)

  #resultcsv內容如下
sunnyFALSEno
sunnyTRUEno
overcastFALSEyes
rainyFALSEyes
rainyFALSEyes
rainyTRUEno
overcastTRUEyes
sunnyFALSEno
sunnyFALSEyes
rainyFALSEyes
sunnyTRUEyes
overcastTRUEyes
overcastFALSEyes
rainyTRUEno
命令行下執行
F:\>sqlldr userid=cqsb/ctbujx  control=resultctl

  搞定


From:http://tw.wingwit.com/Article/program/Oracle/201311/18572.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.