<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 188,comments - 176,trackbacks - 0

    Oracle 的SQL*LOADER可以將外部數據加載到數據庫表中。下面是SQL*LOADER的基本特點:

    1.1  功能
    1)能裝入不同數據類型文件及多個數據文件的數據
    2)可裝入固定格式,自由定界以及可度長格式的數據
    3)可以裝入二進制,壓縮十進制數據
    4)一次可對多個表裝入數據
    5)連接多個物理記錄裝到一個記錄中
    6)對一單記錄分解再裝入到表中
    7)可以用 數對制定列生成唯一的KEY
    8)可對磁盤或 磁帶數據文件裝入制表中
    9)提供裝入錯誤報告
    10)可以將文件中的整型字符串,自動轉成壓縮十進制并裝入列表中。

    1.2  控制文件
    控制文件是用一種語言寫的文本文件,這個文本文件能被SQL*LOADER識別。
    SQL*LOADER根據控制文件可以找到需要加載的數據。
    并且分析和解釋這些數據。
    控制文件由三個部分組成:

    全局選件,行,跳過的記錄數等;
    INFILE子句指定的輸入數據;
    數據特性說明。

    1.3  輸入文件
    對于 SQL*Loader, 除控制文件外就是輸入數據。SQL*Loader可從一個或多個指定的文件中讀出數據。如果 數據是在控制文件中指定,就要在控制文件中寫成 INFILE * 格式。當數據固定的格式(長度一樣)時且是在文件中得到時,要用INFILE <datafile_name> "fix n"

    load data
    infile 'example.dat' "fix 11"
    into table example
    fields terminated by ',' optionally enclosed by '"'
    (col1 char(5),
    col2 char(7))
    example.dat:
    001, cd, 0002,fghi,
    00003,lmn,
    1, "pqrs",
    0005,uvwx,

    當數據是可變格式(長度不一樣)時且是在文件中得到時,要用INFILE <datafile_name> "var n"。如:

    load data
    infile 'example.dat' "var 3"
    into table example
    fields terminated by ',' optionally enclosed by '"'
    (col1 char(5),
    col2 char(7))
    example.dat:
    009hello,cd,010world,im,
    012my,name is,

    1.4  壞文件
    壞文件包含那些被SQL*Loader拒絕的記錄。被拒絕的記錄可能是不符合要求的記錄。
    壞文件的名字由 SQL*Loader命令的BADFILE 參數來給定。

    1.5  日志文件及日志信息
    當SQL*Loader 開始執行后,它就自動建立 日志文件。日志文件包含有加載的總結,加載中的錯誤信息等。


    [一]控制文件語法
    控制文件的格式如下:

    OPTIONS ( { [SKIP=integer] [ LOAD = integer ]
    [ERRORS = integer] [ROWS=integer]
    [BINDSIZE=integer] [SILENT=(ALL|FEEDBACK|ERROR|DISCARD) ] )
    LOAD[DATA]
    [ { INFILE | INDDN } {file | * }
    [STREAM | RECORD | FIXED length [BLOCKSIZE size]|
    VARIABLE [length] ]
    [ { BADFILE | BADDN } file ]
    {DISCARDS | DISCARDMAX} integr ]
    [ {INDDN | INFILE} . . . ]
    [ APPEND | REPLACE | INSERT ]
    [RECLENT integer]
    [ { CONCATENATE integer |
      CONTINUEIF { [THIS | NEXT] (start[: end])LAST }
    Operator { 'string' | X 'hex' } } ]
    INTO TABLE [user.]table
    [APPEND | REPLACE|INSERT]
    [WHEN condition [AND condition]...]
    [FIELDS [delimiter] ]
    (
      column {
    RECNUM | CONSTANT value |
    SEQUENCE ( { integer | MAX |COUNT} [, increment] ) |
    [POSITION ( { start [end] | * [ + integer] }
    ) ]
    datatype
       [TERMINATED [ BY ] {WHITESPACE| [X] 'character' } ]
        [ [OPTIONALLY] ENCLOSE  [BY] [X]'charcter']
    [NULLIF condition ]
    [DEFAULTIF condotion]
    }
    [ ,...]
    )
    [INTO TABLE...]
    [BEGINDATA]

    1)要加載的數據文件:

    1. INFILE 和INDDN是同義詞,它們后面都是要加載的數據文件。如果用 * 則表示數據就在控制文件內。在INFILE 后可以跟幾個文件。
    2. STRAM 表示一次讀一個字節的數據。新行代表新物理記錄(邏輯記錄可由幾個物理記錄組成)。
    3. RECORD 使用宿主操作系統文件及記錄管理系統。如果數據在控制文件中則使用這種方法。
    4. FIXED length 要讀的記錄長度為length字節,
    5. VARIABLE 被讀的記錄中前兩個字節包含的長度,length 記錄可能的長度。缺傷為8k字節。
    6. BADFILE和BADDN同義。Oracle 不能加載數據到數據庫的那些記錄。
    7. DISCARDFILE和DISCARDDN是同義詞。記錄沒有通過的數據。
    8. DISCARDS和DISCARDMAX是同義詞。Integer 為最大放棄的文件個數。

    2)加載的方法:

    1.APPEND 給表添加行。
    2.INSERT 給空表增加行(如果表中有記錄則退出)。
    3.REPLACE 先清空表在加載數據。
    4.RECLEN 用于兩種情況,1)SQLLDR不能自動計算記錄長度,2)或用戶想看壞文件的完整記錄時。對于后一種,Oracle只能按常規把壞記錄部分寫到錯誤的地方。如果看整條記錄,則可以將整條記錄寫到壞文件中。

    3)指定最大的記錄長度:

    1. CONCATENATE 允許用戶設定一個整數,表示要組合邏輯記錄的數目。

    4)建立邏輯記錄:

    1.THIS 檢查當前記錄條件,如果為真則連接下一個記錄。
    2.NEXT 檢查下一個記錄條件。如果為真,則連接下一個記錄到當前記錄來。
    3.Start: end 表示要檢查在THIS或NEXT字串是否存在繼續串的列,以確定是否進行連接。如:continueif next(1-3)='WAG' 或continueif next(1-3)=X'0d03if'

    5)指定要加載的表:


    1.INTO TABLE 要加的表名。
    2.WHEN 和select WHERE類似。用來檢查記錄的情況,如:when(3-5)='SSM' and (22)='*"

    6)介紹并括起記錄中的字段:

    1. FIELDS  給出記錄中字段的分隔符,FIELDS格式為:

    FIELDS [TERMIALED [BY] {WHITESPACE | [X] 'charcter'} ]
    [ [ OPTIONALLY] ENCLOSE [BY] [X]'charcter' ]

    TERMINATED 讀完前一個字段即開始讀下一個字段直到結束。
    WHITESPACE 是指結束符是空格的意思。包括空格、Tab、換行符、換頁符及回車符。如果是要判斷單字符,可以用單引號括起,如X'1B'等。
    OPTIONALLY ENCLOSED 表示數據應由特殊字符括起來。也可以括在TERMINATED字符內。使用OPTIONALLY要同時用TERMINLATED。
    ENCLOSED 指兩個分界符內的數據。如果同時用 ENCLOSED和TERMINAED ,則它們的順序決定計算的順序。

    7)定義列:

    column   是表列名。列的取值可以是:
    BECHUM   表示邏輯記錄數。第一個記錄為1,第2個記錄為2。
    CONSTANT  表示賦予常數。
    SEQUENCE        表示序列可以從任意序號開始,格式為:
    SEQUENCE       ( { integer | MAX |COUNT} [,increment]
    POSITION  給出列在邏輯記錄中的位置??梢允墙^對的,或相對前一列的值。
    格式為:
    POSITION ( {start[end] | * [+integer] } )
    Start 開始位置
    * 表示前字段之后立刻開始。
    + 從前列開始向后條的位置數。

    8)定義數據類型:
    可以定義14種數據類型:
    CHAR 
    DATE
    DECIMAL EXTERNAL
    DECIMAL
    DOUBLE
    FLOAT
    FLOAT EXTERNAL
    GRAPHIC EXTERNAL
    INTEGER
    INTEGER EXTERNAL
    SMALLINT
    VARCHAR
    VARGRAPHIC

    1.字符類型數據
    CHAR  [ (length)] [delimiter]
    length缺省為 1.

    2.日期類型數據
    DATE [ ( length)]['date_format' [delimiter]
    使用to_date函數來限制。

    3.字符格式中的十進制
    DECIMAL EXTERNAL [(length)] [delimiter]
    用于常規格式的十進制數(不是二進制=> 一個位等于一個bit)。

    4.壓縮十進制格式數據
    DECIMAL (digtial [,precision])

    5.雙精度符點二進制
    DOUBLE

    6.普通符點二進制
    FLOAT

    7.字符格式符點數
    FLOAT EXTERNAL [ (length) ] [delimiter]

    8.雙字節字符串數據
    GRAPHIC [ (legth)]

    9.雙字節字符串數據
    GRAPHIC EXTERNAL[ (legth)]

    10.常規全字二進制整數
    INTEGER

    11.字符格式整數
    INTEGER EXTERNAL

    12.常規全字二進制數據
    SMALLINT

    13.可變長度字符串
    VARCHAR

    14.可變雙字節字符串數據
    VARGRAPHIC


    [二]寫控制文件CTL

    1.1  數據文件的要求: 數據類型的指定
          CHAR    字符型
          INTEGER  EXTERNAL   整型
          DECIMAL  EXTERNAL   浮點型

    1.  各數據文件的文件名;
    2.  各數據文件格式;
    3.  各數據文件里各數據記錄字段的屬性;
    4.  接受數據的ORACLE表列的屬性;
    5.  數據定義;
    6.  其它


    2.1  數據文件的內容

    可以在OS下的一個文件;或跟在控制文件下的具體數據。數據文件可以是:
    1、 二進制與字符格式:LOADER可以把二進制文件讀(當成字符讀)列表中
    2、 固定格式:記錄中的數據、數據類型、 數據長度固定。
    3、 可變格式:每個記錄至少有一個可變長數據字段,一個記錄可以是一個連續的字符串。數據段的分界(如姓名、年齡)如用“,”作字段的 分 ;用,"’作數據括號等
    4、 LOADER可以使用多個連續字段的物理記錄組成一個邏輯記錄,記錄文件運行情況文件:包括以下內容:
    1、 運行日期:軟件版本號
    2、 全部輸入,輸出文件名;對命令行的展示信息,補充信息,
    3、 對每個裝入信息報告:如表名,裝入情況;對初始裝入, 加截入或更新裝入的選擇情況,欄信息
    4、 數據錯誤報告:錯誤碼;放棄記錄報告
    5、 每個裝X報告:裝入行;裝入行數,可能跳過行數;可能拒絕行數;可能放棄行數等
    6、 統計概要:使用空間(包大小,長度);讀入記錄數,裝入記錄數,跳過記錄數;拒絕記錄數,放棄記錄數;運行時間等。


    [三]實際使用 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等。
      
      (1)加載可變長度或指定長度的記錄
      
      如:
      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,"
      
      (2)下面是導入固定位置(固定長度)數據示例:
      LOAD DATA
      INFILE *
      INTO TABLE load_positional_data
      ( data1 POSITION(1:5),
      data2 POSITION(6:15)
      )
      BEGINDATA
      11111AAAAAAAAAA
      22222BBBBBBBBBB
      
      (3)跳過數據行:
      
      可以用 "SKIP n" 關鍵字來指定導入時可以跳過多少行數據。如:
      LOAD DATA
      INFILE *
      INTO TABLE load_positional_data
      SKIP 5
      ( data1 POSITION(1:5),
      data2 POSITION(6:15)
      )
      BEGINDATA
      11111AAAAAAAAAA
      22222BBBBBBBBBB
      
      (4)導入數據時修改數據:
      
      在導入數據到數據庫時,可以修改數據。注意,這僅適合于常規導入,并不適合 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
      )
      
      (5)將數據導入多個表:
      
      如:
      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
      )
      
      (6)導入選定的記錄:
      
      如下例: (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
      )
      
      (7)導入時跳過某些字段:
      
      可用 POSTION(x:y) 來分隔數據. 在Oracle8i中可以通過指定 FILLER 字段實現。FILLER 字段用來跳過、忽略導入數據文件中的字段.如:
      LOAD DATA
      TRUNCATE INTO TABLE T1
      FIELDS TERMINATED BY ','
      ( field1,
      field2 FILLER,
      field3
      )
      
      (8)導入多行記錄:
      
      可以使用下面兩個選項之一來實現將多行數據導入為一個記錄:
      
      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.

            (9)去掉導入記錄的前后空格:
      create_customer_file2()
    {
            echo "LOAD DATA
    INFILE '$SQLLDR_DIR/$SQLLDR_DATA_DIR/$1'
    INTO TABLE zxdbm_ismp.service
    APPEND
    FIELDS TERMINATED BY \"|\"
    TRAILING NULLCOLS
    (
    serviceid \"trim(:serviceid)\",                     
    SPID \"trim(:SPID)\",
    AccessNo \"trim(:AccessNo)\",                           
    ServiceType \"trim(:ServiceType)\" 
    )
    " >$SQLLDR_DIR/$SQLLDR_CONTROL_DIR/$1.ctl      
    }
    trim函數可以去掉文件每列的一前和一后的所有空格,當本列為空時,則導入也為空,當本列為一個或多個空格時,導入也為空。前提是表的該字段允許為NULL。


      

    [四]SQL*Loader 數據的提交:
      
      1)一般情況下是在導入數據文件數據后提交的。
      
      2)也可以通過指定 ROWS= 參數來指定每次提交記錄數。
      
      提高 SQL*Loader 的性能:
      
      1) 一個簡單而容易忽略的問題是,沒有對導入的表使用任何索引和/或約束(主鍵)。如果這樣做,甚至在使用ROWS=參數時,會很明顯降低數據庫導入性能。
      
      2) 可以添加DIRECT=TRUE來提高導入數據的性能。當然,在很多情況下,不能使用此參數。
      
      3) 通過指定UNRECOVERABLE選項,可以關閉數據庫的日志。這個選項只能和direct一起使用。
      
      4) 可以同時運行多個導入任務.
      
      常規導入與direct導入方式的區別:
      
      常規導入可以通過使用 INSERT語句來導入數據。Direct導入可以跳過數據庫的相關邏(DIRECT=TRUE),而直接將數據導入到數據文件中。

     


              轉:http://hi.baidu.com/ggcong/blog/item/81986e4a610eb02308f7ef02.html

    posted on 2008-05-08 10:41 cheng 閱讀(3673) 評論(0)  編輯  收藏 所屬分類: Oracle
    主站蜘蛛池模板: 国产成人免费a在线资源| 成人无码区免费A片视频WWW | 久久亚洲国产午夜精品理论片| 日产久久强奸免费的看| 免费国产真实迷j在线观看| 国产成人综合亚洲一区| 免费国产美女爽到喷出水来视频| 九九精品国产亚洲AV日韩| 国产91久久久久久久免费| 色多多免费视频观看区一区| 亚洲精品国产电影| 免费看少妇高潮成人片| 亚洲综合激情九月婷婷| 黄色片在线免费观看| jizzjizz亚洲日本少妇| 亚洲人妻av伦理| 嫩草成人永久免费观看| 亚洲视频在线不卡| 成人免费一区二区无码视频| 在线观看国产一区亚洲bd| 亚洲婷婷国产精品电影人久久| 国产色无码精品视频免费| 亚洲不卡中文字幕| 日产乱码一卡二卡三免费| 成人在线免费视频| 亚洲国产精品久久久久网站| 在线观看免费为成年视频| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 亚洲线精品一区二区三区| 十八禁无码免费网站| 亚洲精品又粗又大又爽A片| 亚洲国产精品激情在线观看| 久9热免费精品视频在线观看| 亚洲av永久综合在线观看尤物| 免费一级肉体全黄毛片| 日韩精品在线免费观看| 亚洲国产精品无码久久98| 亚洲精品亚洲人成人网| 久久久久久久免费视频| 99精品视频免费| 最新亚洲精品国偷自产在线 |