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

數據批量sql*load導入Oracle數據庫

2013-11-13 22:15:08  來源: 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/18602.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.