隨筆-314  評論-209  文章-0  trackbacks-0

          oracle sql loader全攻略(一)

          一:sql loader 的特點

          oracle自己帶了很多的工具可以用來進行數據的遷移、備份和恢復等工作。但是每個工具都有自己的特點。

          比如說exp和imp可以對數據庫中的數據進行導出和導出的工作,是一種很好的數據庫備份和恢復的工具,因此主要用在數據庫的熱備份和恢復方面。有著速度快,使用簡單,快捷的優點;同時也有一些缺點,比如在不同版本數據庫之間的導出、導入的過程之中,總會出現這樣或者那樣的問題,這個也許是oracle公司自己產品的兼容性的問題吧。

          sql loader 工具卻沒有這方面的問題,它可以把一些以文本格式存放的數據順利的導入到oracle數據庫中,是一種在不同數據庫之間進行數據遷移的非常方便而且通用的工具。缺點就速度比較慢,另外對blob等類型的數據就有點麻煩了。

          二:sql loader 的幫助

          C:\>sqlldr

          SQL*Loader: Release 9.2.0.1.0 - Production on 星期六 10月 9 14:48:12 2004

          Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

           

          用法: SQLLDR keyword=value [,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 (默認0)

          load -- Number of logical records to load (全部默認)

          errors -- Number of errors to allow (默認50)

          rows -- Number of rows in conventional path bind array or between direct p

          ath data saves

          (默認: 常規路徑 64, 所有直接路徑)

          bindsize -- Size of conventional path bind array in bytes(默認256000)

          silent -- Suppress messages during run (header,feedback,errors,discards,part

          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 unus

          able(默認FALSE)

          readsize -- Size of Read buffer (默認1048576)

          external_table -- use external table for load; NOT_USED, GENERATE_ONLY, EXECUTE(

          默認NOT_USED)

          columnarrayrows -- Number of rows for direct path column array(默認5000)

          streamsize -- Size of direct path stream buffer in bytes(默認256000)

          multithreading -- use multithreading in direct path

          resumable -- enable or disable resumable for current session(默認FALSE)

          resumable_name -- text string to help identify resumable statement

          resumable_timeout -- wait time (in seconds) for RESUMABLE(默認7200)

          date_cache -- size (in entries) of date conversion cache(默認1000)

          PLEASE NOTE: 命令行參數可以由位置或關鍵字指定

          。前者的例子是 'sqlload

          scott/tiger foo'; 后一種情況的一個示例是 'sqlldr control=foo

          userid=scott/tiger'.位置指定參數的時間必須早于

          但不可遲于由關鍵字指定的參數。例如,

          允許 'sqlldr scott/tiger control=foo logfile=log', 但是

          不允許 'sqlldr scott/tiger control=foo log', 即使

          參數 'log' 的位置正確。

          C:\>

          三:sql loader使用例子

          a)SQLLoader將 Excel 數據導出到 Oracle

          1.創建SQL*Loader輸入數據所需要的文件,均保存到C:\,用記事本編輯:

          控制文件:input.ctl,內容如下:

          load data --1、控制文件標識

          infile 'test.txt' --2、要輸入的數據文件名為test.txt

          append into table test--3、向表test中追加記錄

          fields terminated by X'09'--4、字段終止于X'09',是一個制表符(TAB)

          (id,username,password,sj) -----定義列對應順序

          a、insert,為缺省方式,在數據裝載開始時要求表為空

          b、append,在表中追加新記錄

          c、replace,刪除舊記錄,替換成新裝載的記錄

          d、truncate,同上

          在DOS窗口下使用SQL*Loader命令實現數據的輸入

          C:\>sqlldr userid=system/manager control=input.ctl

          默認日志文件名為:input.log

          默認壞記錄文件為:input.bad

          2.還有一種方法

          可以把EXCEL文件另存為CSV(逗號分隔)(*.csv),控制文件就改為用逗號分隔

          LOAD DATA

          INFILE 'd:\car.csv'

          APPEND INTO TABLE t_car_temp

          FIELDS TERMINATED BY ","

          (phoneno,vip_car)

          b)在控制文件中直接導入數據

          1、控制文件test.ctl的內容

          -- The format for executing this file with SQL Loader is:

          -- SQLLDR control= Be sure to substitute your

          -- version of SQL LOADER and the filename for this file.

          LOAD DATA

          INFILE *

          BADFILE 'C:\Documents and Settings\Jackey\桌面\WMCOUNTRY.BAD'

          DISCARDFILE 'C:\Documents and Settings\Jackey\桌面\WMCOUNTRY.DSC'

          INSERT INTO TABLE EMCCOUNTRY

          Fields terminated by ";" Optionally enclosed by '"'

          (

          COUNTRYID NULLIF (COUNTRYID="NULL"),

          COUNTRYCODE,

          COUNTRYNAME,

          CONTINENTID NULLIF (CONTINENTID="NULL"),

          MAPID NULLIF (MAPID="NULL"),

          CREATETIME DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (CREATETIME="NULL"),

          LASTMODIFIEDTIME DATE "MM/DD/YYYY HH24:MI:SS" NULLIF (LASTMODIFIEDTIME="NULL")

          )

          BEGINDATA

          1;"JP";"Japan";1;9;"09/16/2004 16:31:32";NULL

          2;"CN";"China";1;10;"09/16/2004 16:31:32";NULL

          3;"IN";"India";1;11;"09/16/2004 16:31:32";NULL

          4;"AU";"Australia";6;12;"09/16/2004 16:31:32";NULL

          5;"CA";"Canada";4;13;"09/16/2004 16:31:32";NULL

          6;"US";"United States";4;14;"09/16/2004 16:31:32";NULL

          7;"MX";"Mexico";4;15;"09/16/2004 16:31:32";NULL

          8;"GB";"United Kingdom";3;16;"09/16/2004 16:31:32";NULL

          9;"DE";"Germany";3;17;"09/16/2004 16:31:32";NULL

          10;"FR";"France";3;18;"09/16/2004 16:31:32";NULL

          11;"IT";"Italy";3;19;"09/16/2004 16:31:32";NULL

          12;"ES";"Spain";3;20;"09/16/2004 16:31:32";NULL

          13;"FI";"Finland";3;21;"09/16/2004 16:31:32";NULL

          14;"SE";"Sweden";3;22;"09/16/2004 16:31:32";NULL

          15;"IE";"Ireland";3;23;"09/16/2004 16:31:32";NULL

          16;"NL";"Netherlands";3;24;"09/16/2004 16:31:32";NULL

          17;"DK";"Denmark";3;25;"09/16/2004 16:31:32";NULL

          18;"BR";"Brazil";5;85;"09/30/2004 11:25:43";NULL

          19;"KR";"Korea, Republic of";1;88;"09/30/2004 11:25:43";NULL

          20;"NZ";"New Zealand";6;89;"09/30/2004 11:25:43";NULL

          21;"BE";"Belgium";3;79;"09/30/2004 11:25:43";NULL

          22;"AT";"Austria";3;78;"09/30/2004 11:25:43";NULL

          23;"NO";"Norway";3;82;"09/30/2004 11:25:43";NULL

          24;"LU";"Luxembourg";3;81;"09/30/2004 11:25:43";NULL

          25;"PT";"Portugal";3;83;"09/30/2004 11:25:43";NULL

          26;"GR";"Greece";3;80;"09/30/2004 11:25:43";NULL

          27;"IL";"Israel";1;86;"09/30/2004 11:25:43";NULL

          28;"CH";"Switzerland";3;84;"09/30/2004 11:25:43";NULL

          29;"A1";"Anonymous Proxy";0;0;"09/30/2004 11:25:43";NULL

          30;"A2";"Satellite Provider";0;0;"09/30/2004 11:25:43";NULL

          31;"AD";"Andorra";3;0;"09/30/2004 11:25:43";NULL

          32;"AE";"United Arab Emirates";1;0;"09/30/2004 11:25:43";NULL

          33;"AF";"Afghanistan";1;0;"09/30/2004 11:25:43";NULL

          34;"AG";"Antigua and Barbuda";7;0;"09/30/2004 11:25:43";NULL

          35;"AI";"Anguilla";7;0;"09/30/2004 11:25:43";NULL

          36;"AL";"Albania";3;0;"09/30/2004 11:25:43";NULL

          37;"AM";"armenia";3;0;"09/30/2004 11:25:43";NULL

          38;"AN";"Netherlands Antilles";3;0;"09/30/2004 11:25:43";NULL

          39;"AO";"Angola";2;0;"09/30/2004 11:25:43";NULL

          40;"AP";"Asia/Pacific Region";2;0;"09/30/2004 11:25:43";NULL

          41;"AQ";"Antarctica";8;0;"09/30/2004 11:25:43";NULL

          42;"AR";"Argentina";5;0;"09/30/2004 11:25:43";NULL

          43;"AS";"American Samoa";6;0;"09/30/2004 11:25:43";NULL

          44;"AW";"Aruba";5;0;"09/30/2004 11:25:43";NULL

          45;"AZ";"Azerbaijan";1;0;"09/30/2004 11:25:43";NULL

          46;"BA";"Bosnia and Herzegovina";3;0;"09/30/2004 11:25:43";NULL

          47;"BB";"Barbados";5;0;"09/30/2004 11:25:43";NULL

          48;"BD";"Bangladesh";1;0;"09/30/2004 11:25:43";NULL

          49;"BF";"Burkina Faso";2;0;"09/30/2004 11:25:43";NULL

          50;"BG";"Bulgaria";3;0;"09/30/2004 11:25:43";NULL

          51;"BH";"Bahrain";1;0;"09/30/2004 11:25:43";NULL

          52;"BI";"Burundi";2;0;"09/30/2004 11:25:43";NULL

          53;"BJ";"Benin";2;0;"09/30/2004 11:25:43";NULL

          54;"BM";"Bermuda";4;0;"09/30/2004 11:25:43";NULL

          55;"BN";"Brunei Darussalam";1;0;"09/30/2004 11:25:43";NULL

          56;"BO";"Bolivia";5;0;"09/30/2004 11:25:43";NULL

          57;"BS";"Bahamas";7;0;"09/30/2004 11:25:43";NULL

          58;"BT";"Bhutan";1;0;"09/30/2004 11:25:43";NULL

          59;"BV";"Bouvet Island";5;0;"09/30/2004 11:25:43";NULL

          60;"BW";"Botswana";2;0;"09/30/2004 11:25:43";NULL

          61;"BY";"Belarus";3;0;"09/30/2004 11:25:43";NULL

          2、執行導入命令

          C:\>sqlldr userid=system/manager control=test.ct

          part ii

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

           

          如何使用 SQL*Loader 工具

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

          sqlldr scott/tiger control=loader.ctl

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

          load data

          infile 'c:\data\mydata.csv'

          into table emp

          fields terminated by "," optionally enclosed by '"'

          ( empno, empname, sal, deptno )

          mydata.csv 如下:

          10001,"Scott Tiger", 1000, 40

          10002,"Frank Naude", 500, 20

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

          load data

          infile *

          replace

          into table departments

          ( dept position (02:05) char(4),

          deptname position (08:27) char(20)

          )

          begindata

          COSC COMPUTER SCIENCE

          ENGL ENGLISH LITERATURE

          MATH MATHEMATICS

          POLY POLITICAL SCIENCE

          Unloader這樣的工具

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

          set echo off newpage 0 space 0 pagesize 0 feed off head off trimspool on

          spool oradata.txt

          select col1 || ',' || col2 || ',' || col3

          from tab1

          where col2 = 'XYZ';

          spool off

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

          rem Remember to update initSID.ora, utl_file_dir='c:\oradata' parameter

          declare

          fp utl_file.file_type;

          begin

          fp := utl_file.fopen('c:\oradata','tab1.txt','w');

          utl_file.putf(fp, '%s, %s\n', 'TextField', 55);

          utl_file.fclose(fp);

          end;

          /

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

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

          如:

          LOAD DATA

          INFILE *

          INTO TABLE load_delimited_data

          FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'

          TRAILING NULLCOLS

          ( data1,

          data2

          )

          BEGINDATA

          11111,AAAAAAAAAA

          22222,"A,B,C,D,"

          下面是導入固定位置(固定長度)數據示例:

          LOAD DATA

          INFILE *

          INTO TABLE load_positional_data

          ( data1 POSITION(1:5),

          data2 POSITION(6:15)

          )

          BEGINDATA

          11111AAAAAAAAAA

          22222BBBBBBBBBB

          跳過數據行:

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

          LOAD DATA

          INFILE *

          INTO TABLE load_positional_data

          SKIP 5

          ( data1 POSITION(1:5),

          data2 POSITION(6:15)

          )

          BEGINDATA

          11111AAAAAAAAAA

          22222BBBBBBBBBB

          導入數據時修改數據:

          在導入數據到數據庫時,可以修改數據。注意,這僅適合于常規導入,并不適合 direct導入方式.如:

          LOAD DATA

          INFILE *

          INTO TABLE modified_data

          ( rec_no "my_db_sequence.nextval",

          region CONSTANT '31',

          time_loaded "to_char(SYSDATE, 'HH24:MI')",

          data1 POSITION(1:5) ":data1/100",

          data2 POSITION(6:15) "upper(:data2)",

          data3 POSITION(16:22)"to_date(:data3, 'YYMMDD')"

          )

          BEGINDATA

          11111AAAAAAAAAA991201

          22222BBBBBBBBBB990112

          LOAD DATA

          INFILE 'mail_orders.txt'

          BADFILE 'bad_orders.txt'

          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(1:4) INTEGER EXTERNAL,

          ename POSITION(6:15) CHAR,

          deptno POSITION(17:18) CHAR,

          mgr POSITION(20:23) INTEGER EXTERNAL

          )

          INTO TABLE proj

          WHEN projno != ' '

          ( projno POSITION(25:27) INTEGER EXTERNAL,

          empno POSITION(1:4) INTEGER EXTERNAL

          )

          導入選定的記錄:

          如下例: (01) 代表第一個字符, (30:37) 代表30到37之間的字符:

          LOAD DATA

          INFILE 'mydata.dat' BADFILE 'mydata.bad' DISCARDFILE 'mydata.dis'

          APPEND

          INTO TABLE my_selective_table

          WHEN (01) <> 'H' and (01) <> 'T' and (30:37) = '19991217'

          (

          region CONSTANT '31',

          service_key POSITION(01:11) INTEGER EXTERNAL,

          call_b_no POSITION(12:29) CHAR

          )

          導入時跳過某些字段:

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

          LOAD DATA

          TRUNCATE INTO TABLE T1

          FIELDS TERMINATED BY ','

          ( field1,

          field2 FILLER,

          field3

          )

          導入多行記錄:

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

          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 one. Eg. by having a '#' character in column 1.

          SQL*Loader 數據的提交:

          一般情況下是在導入數據文件數據后提交的。

          也可以通過指定 ROWS= 參數來指定每次提交記錄數。

          提高 SQL*Loader 的性能:

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

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

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

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

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

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

          posted on 2010-03-24 15:34 xzc 閱讀(789) 評論(1)  編輯  收藏 所屬分類: Oracle

          評論:
          # re: oracle sql loader全攻略 2010-03-24 16:22 | xzc
          #!/bin/bash
          . /odsstatfs/.profile

          cd /odsstatfs/scripts/group/
          curday=`date +'%Y%m%d'`
          #echo 文件名:${1}

          cat > MID_IC_CARD_TICKET_DAY.ctl << EOF
          LOAD DATA
          INFILE '/odsstatfs/cardfile/Card_Ticket_${1}.txt'
          truncate
          INTO TABLE MID_IC_CARD_TICKET_DAY
          FIELDS TERMINATED BY '|'
          TRAILING NULLCOLS(
          DATE_NO integer external,
          AREA_ID integer external,
          CARD_ID char,
          CALLING_NBR char,
          CALLED_NBR char,
          CALL_TIME char,
          DURATION integer external,
          AMOUNT integer external,
          CALL_ID integer external
          )
          EOF


          ## 導入數據
          sqlldr odsstat/xxx@odsstat control=MID_IC_CARD_TICKET_DAY.ctl direct=y errors=10

          #刪除控制文件
          #cd /odsstatfs/groupfs/
          #rm MID_IC_CARD_TICKET_DAY.ctl

          #IC卡接口表數據導入完成
          sqlplus odsstat/xxx@odsstat <<EOF
          DELETE FROM ods_data_msg WHERE ACCT_MONTH=to_char(sysdate,'YYYYMMDD') and upper(TABLE_CODE)='MID_IC_CARD_TICKET_DAY';
          insert into ods_data_msg (ACCT_MONTH, SYSTEM_ID, TABLE_CODE, TASK_NAME, STATE_DATE, MSG_FLAG, COMMENTS)
          values (to_char(sysdate,'YYYYMMDD'), 1, 'MID_IC_CARD_TICKET_DAY', 'IC卡接口表數據導入完成', sysdate, 'T', 'IC卡接口表數據導入完成');
          exit
          EOF
          echo 數據加載完成  回復  更多評論
            
          主站蜘蛛池模板: 报价| 凤翔县| 潜山县| 滨海县| 清河县| 上饶市| 堆龙德庆县| 沂南县| 修文县| 宣武区| 宁海县| 井冈山市| 红原县| 鄯善县| 顺平县| 岳西县| 上虞市| 锡林郭勒盟| 凤凰县| 榆林市| 天峻县| 米脂县| 温泉县| 越西县| 高州市| 肥城市| 抚顺市| 大姚县| 潜江市| 泰顺县| 崇州市| 五大连池市| 宽甸| 新建县| 富源县| 秦皇岛市| 项城市| 巴塘县| 房产| 晋州市| 开原市|