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

簡述數據庫導入OracleSQL*Loader指南

2013-11-13 16:23:18  來源: Oracle 

  SQL*Loader是Oracle數據庫導入外部數據的一個工具它和DB的Load工具相似但有更多的選擇它支持變化的加載模式可選的加載及多表加載

  

  如何使用 SQL*Loader 工具

  我們可以用Oracle的sqlldr工具來導入數據例如:

  sqlldr scott/tiger control=loaderctl

  控制文件(loaderctl) 將加載一個外部數據文件(含分隔符)loaderctl如下:

  

  load data infile c:\data\mydatacsv into table emp fields terminated by optionally enclosed by ( empno empname sal deptno )

  mydatacsv 如下:

  

  Scott Tiger Frank Naude

  下面是一個指定記錄長度的示例控制文件* 代表數據文件與此文件同名即在後面使用BEGINDATA段來標識數據

  

  load data infile * replace into table departments ( dept position (:) char() deptname position (:) char() ) begindata COSC COMPUTER SCIENCE ENGL ENGLISH LITERATURE MATH MATHEMATICS POLY POLITICAL SCIENCE

  Unloader這樣的工具

  Oracle 沒有提供將數據導出到一個文件的工具但是我們可以用SQL*Plus的select 及 format 數據來輸出到一個文件

  

  set echo off newpage space pagesize feed off head off trimspool on spool oradatatxt select col || || col || || col from tab where col = XYZ; spool off

  另外也可以使用使用 UTL_FILE PL/SQL 包處理:

  

  rem Remember to update initSIDora utl_file_dir=c:\oradata parameter declare fp utl_filefile_type; begin fp := utl_filefopen(c:\oradatatabtxtw); utl_fileputf(fp %s %s\n TextField ); utl_filefclose(fp); end; /

  當然你也可以使用第三方工具如SQLWays TOAD for Quest等

  

  加載可變長度或指定長度的記錄

  

  LOAD DATA INFILE * INTO TABLE load_delimited_data FIELDS TERMINATED BY OPTIONALLY ENCLOSED BY TRAILING NULLCOLS ( data data ) BEGINDATA AAAAAAAAAA ABCD 下面是導入固定位置(固定長度)數據示例 LOAD DATA INFILE * INTO TABLE load_positional_data ( data POSITION(:) data POSITION(:) ) BEGINDATA AAAAAAAAAA BBBBBBBBBB

  跳過數據行可以用 SKIP n關鍵字來指定導入時可以跳過多少行數據

  

  LOAD DATA INFILE * INTO TABLE load_positional_data SKIP ( data POSITION(:) data POSITION(:) ) BEGINDATA AAAAAAAAAA BBBBBBBBBB

  導入數據時修改數據

  在導入數據到數據庫時可以修改數據注意這僅適合於常規導入並不適合 direct導入方式

  

  LOAD DATA INFILE * INTO TABLE modified_data ( rec_no my_db_sequencenextval region CONSTANT time_loaded to_char(SYSDATE HH:MI) data POSITION(:) :data/ data POSITION(:) upper(:data) data POSITION(:)to_date(:data YYMMDD) ) BEGINDATA AAAAAAAAAA BBBBBBBBBB LOAD DATA INFILE mail_orderstxt BADFILE bad_orderstxt APPEND INTO TABLE mailing_list FIELDS TERMINATED BY ( addr city state zipcode mailing_addr decode(:mailing_addr null :addr :mailing_addr) mailing_city decode(:mailing_city null :city :mailing_city) mailing_state )

  將數據導入多個表

  如:

  

  LOAD DATA INFILE * REPLACE INTO TABLE emp WHEN empno != ( empno POSITION(:) INTEGER EXTERNAL ename POSITION(:) CHAR deptno POSITION(:) CHAR mgr POSITION(:) INTEGER EXTERNAL ) INTO TABLE proj WHEN projno != ( projno POSITION(:) INTEGER EXTERNAL empno POSITION(:) INTEGER EXTERNAL )

  導入選定的記錄

  如下例 () 代表第一個字符 (:) 代表之間的字符:

  

  LOAD DATA INFILE mydatadat BADFILE mydatabad DISCARDFILE mydatadis APPEND INTO TABLE my_selective_table WHEN () <>; H and () <>; T and (:) = ( region CONSTANT service_key POSITION(:) INTEGER EXTERNAL call_b_no POSITION(:) CHAR )

  導入時跳過某些字段

  可用 POSTION(x:y) 來分隔數據在Oraclei中可以通過指定FILLER字段實現FILLER 字段用來跳過忽略導入數據文件中的字段

  

  LOAD DATA TRUNCATE INTO TABLE T FIELDS TERMINATED BY ( field field FILLER field )

  導入多行記錄

  可以使用下面兩個選項之一來實現將多行數據導入為一個記錄:

  

  CONCATENATE: use when SQL*Loader should combine the same number of physical records together to form one logical record CONTINUEIF use if a condition indicates that multiple records should be treated as oneEgby having a # character in column

  SQL*Loader 數據的提交

  一般情況下是在導入數據文件數據後提交的也可以通過指定 ROWS= 參數來指定每次提交記錄數

  

  提高 SQL*Loader 的性能

  () 一個簡單而容易忽略的問題是沒有對導入的表使用任何索引和/或約束(主鍵)如果這樣做甚至在使用ROWS=參數時會很明顯降低數據庫導入性能

  () 可以添加 DIRECT=TRUE來提高導入數據的性能當然在很多情況下不能使用此參數

  () 通過指定 UNRECOVERABLE選項可以關閉數據庫的日志這個選項只能和 direct 一起使用

  () 可以同時運行多個導入任務

  

  常規導入與direct導入方式的區別

  常規導入可以通過使用 INSERT語句來導入數據Direct導入可以跳過數據庫的相關邏輯(DIRECT=TRUE)而直接將數據導入到數據文件中


From:http://tw.wingwit.com/Article/program/Oracle/201311/18244.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.