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

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

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

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
    ?
    SQLLDR應用舉例
    ?
    ?

    1、普通裝載?
    LOAD DATA
    INFILE *
    INTO TABLE DEPT
    REPLACE
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'?
    (DEPTNO,
    ?DNAME,
    ?LOC
    )
    BEGINDATA
    10,Sales,"""USA"""
    20,Accounting,"Virginia,USA"?
    30,Consulting,Virginia
    40,Finance,Virginia
    50,"Finance","",Virginia?--loc 列將為空
    60,"Finance",,Virginia???--loc 列將為空

    注:BEGINDATA后的數值前面不能有空格
    ?

    2、TERMINATED BY WHITESPACE 和 FIELDS TERMINATED BY x'09' 的情況?
    LOAD DATA?
    INFILE *?
    INTO TABLE DEPT?
    REPLACE?
    FIELDS TERMINATED BY WHITESPACE?
    --FIELDS TERMINATED BY x'20'?
    (DEPTNO,??
    ?DNAME,??
    ?LOC?
    )?
    BEGINDATA?
    10 Sales Virginia
    ?
    注:x'20'表示字符ASCII碼的16進制數值

    ??
    3、指定不裝載那一列?
    LOAD DATA?
    INFILE *?
    INTO TABLE DEPT?
    REPLACE?
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'?
    (DEPTNO,??
    ?FILLER_1 FILLER,??--下面的 "Something Not To Be Loaded" 將不會被裝載??
    ?DNAME,??
    ?LOC?
    )?
    BEGINDATA?
    20,Something Not To Be Loaded,Accounting,"Virginia,USA"
    ??
    ?
    4、position的列子?
    LOAD DATA?
    INFILE *?
    INTO TABLE DEPT?
    REPLACE?
    (DEPTNO position(1:2),??
    ?DNAME position(*:16),?--這個字段的開始位置在前一字段的結束位置??
    ?LOC position(*:29),??
    ?ENTIRE_LINE position(1:29)?
    )?
    BEGINDATA?
    10Accounting Virginia,USA
    ??
    ?
    結果:10 | Accounting Vir?| ginia,USA |?10Accounting Virginia,USA
    ?

    5、使用函數日期的一種表達TRAILING NULLCOLS的使用?
    LOAD DATA?
    INFILE *?
    INTO TABLE DEPT
    REPLACE
    FIELDS TERMINATED BY ','
    TRAILING NULLCOLS
    --這句的意思是將沒有對應值的列都置為null
    --如果第一行改為 10,Sales,Virginia,1/5/2000,, 就不用TRAILING NULLCOLS了?
    (DEPTNO,??
    ?DNAME "upper(:dname)",?--使用函數??
    ?LOC "upper(:loc)",??
    ?LAST_UPDATED date 'dd/mm/yyyy',?--日期的一種表達方式。還有'dd-mon-yyyy'等
    ?ENTIRE_LINE ":deptno||:dname||:loc||:last_updated"?
    )?
    BEGINDATA?
    10,Sales,Virginia,1/5/2000?
    20,Accounting,Virginia,21/6/1999?
    30,Consulting,Virginia,5/1/2000?
    40,Finance,Virginia,15/3/2001??
    注:可以通過:dname類型調用函數,特別注意date函數的使用。
    ?

    6、合并多行記錄為一行記錄?

    LOAD DATA?
    INFILE *?
    concatenate 3?--通過關鍵字concatenate 把幾行的記錄看成一行記錄?
    INTO TABLE DEPT?
    replace?
    FIELDS TERMINATED BY ','?
    (DEPTNO,??
    ?DNAME "upper(:dname)",??
    ?LOC "upper(:loc)",??
    ?LAST_UPDATED date 'dd/mm/yyyy'?
    )?
    BEGINDATA?
    10,Sales,
    Virginia,
    1/5/2000

    注:例如有些文本文件以N行為一循環記錄數據,則可以這樣導入。
    ?
    ?
    7、使用continueif來合并記錄行
    ?
    上例可直接使用continueif last= ','來告訴Oracle如果前一個數據以','結尾,則這個附加到上一行
    ?
    LOAD DATA?
    INFILE *?
    continueif last= ','
    INTO TABLE DEPT?
    replace?
    FIELDS TERMINATED BY ','?
    (DEPTNO,??
    ?DNAME "upper(:dname)",??
    ?LOC "upper(:loc)",??
    ?LAST_UPDATED date 'dd/mm/yyyy'?
    )?
    BEGINDATA?
    10,Sales,
    Virginia,
    1/5/2000
    ?
    注:ContinueIf還可以使用this或next選項,具體操作見文檔

    8、載入每行的行號??
    ?
    LOAD DATA?
    INFILE *?
    INTO TABLE DEPT?
    replace?
    (DEPTNORECNUM //載入每行的行號??
    ?ENTIRE_LINEPosition(1:1024)
    )?
    BEGINDATA?
    fsdfasj?????--自動分配行號到DEPTNO字段,此行為1?
    fasdjfasdfl?--自動遞增,此行為2

    ?
    9、載入有換行符的數據

    使用一個非換行符的字符
    LOAD DATA?
    INFILE *?
    INTO TABLE DEPT?
    REPLACE?
    FIELDS TERMINATED BY ','?
    TRAILING NULLCOLS?
    (DEPTNO,?
    DNAME "upper(:dname)",?
    LOC "upper(:loc)",?
    LAST_UPDATED "my_to_date( :last_updated )",?
    COMMENTS "replace(:comments,'%%',chr(10))"? --用replace函數轉換成換行符?
    )?
    BEGINDATA?
    10,Sales,Virginia,01-april-2001,This is the Sales%%Office in Virginia?
    20,Accounting,Virginia,13/04/2001,This is the Accounting%%Office in Virginia?
    30,Consulting,Virginia,14/04/2001 12:02:02,This is the Consulting%%Office in Virginia?
    40,Finance,Virginia,987268297,This is the Finance%%Office in Virginia
    ??
    注:換行的特殊字符如果使用'\n',則會在Windows編譯過程中直接換成換行符,導致無法轉換
    ?

    使用fix屬性

    Load DATA?
    INFILE demo1.dat "fix 68"?
    INTO TABLE t1_a?
    REPLACE?
    FIELDS TERMINATED BY ','?
    TRAILING NULLCOLS?
    (DEPTNO,?
    DNAME "upper(:dname)",?
    LOC "upper(:loc)",?
    LAST_UPDATED Date 'dd/mm/yyyy',
    ENTIRE_LINE?
    )
    demo1.dat?
    10,aaaab,Virginia,01/05/2001,This is the aaaab
    Office in Virginia
    20,aaaac,Virginia,13/04/2001,This is the aaaac
    Office in Virginia
    30,aaaad,Virginia,14/04/2001,This is the aaaad
    Office in Virginia
    40,aaaae,Virginia,16/02/2001,This is the aaaae
    Office in Virginia
    ?
    注:fix只能加在外部文件數據導入時,另外需要每行數據長度都相等。
    ??
    --下面這種方法也一樣

    Load DATA?
    INFILE demo17.dat "fix 70"?
    INTO TABLE t1_a?
    REPLACE?
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'?
    TRAILING NULLCOLS?
    (DEPTNO,??
    ?DNAME "upper(:dname)",??
    ?LOC "upper(:loc)",??
    ?LAST_UPDATED Date 'dd/mm/yyyy',
    ?ENTIRE_LINE?
    )
    demo2.dat?
    10,aaaab,Virginia,01/05/2001,"This is the aaaab
    Office in Virginia"
    20,aaaac,Virginia,13/04/2001,"This is the aaaac
    Office in Virginia"
    30,aaaad,Virginia,14/04/2001,"This is the aaaad
    Office in Virginia"
    40,aaaae,Virginia,16/02/2001,"This is the aaaae
    Office in Virginia"?

    ③ 使用var屬性

    Load DATA?
    INFILE demo17.dat "var 3"?
    INTO TABLE t1_a?
    REPLACE?
    FIELDS TERMINATED BY ','
    TRAILING NULLCOLS?
    (DEPTNO,??
    ?DNAME "upper(:dname)",??
    ?LOC "upper(:loc)",??
    ?LAST_UPDATED Date 'dd/mm/yyyy',
    ?ENTIRE_LINE?
    )
    demo17.dat?
    03510,Sales,Virginia,01/01/2001,This
    03920,Accounting,Virginia,13/04/2001,Thi
    04530,Consulting,Virginia,14/04/2001,This is t
    07140,Finance,Virginia,14/04/2001,This is the Finance Office
    ?in Virginia

    注:var 3 表示前三位用于說明該條記錄的長度 (但是誰告訴我長度怎么數的?-_-|||)
    ?

    使用str屬性
    ??
    可使用str來定義一個行結尾符??
    ?
    計算以|\r\n 結束的值:?
    select utl_raw.cast_to_raw('|'||chr(13)||chr(10)) from dual;?
    結果 7C0D0A
    ?
    Load DATA?
    INFILE demo17.dat "str X'7C0D0A'"?
    INTO TABLE t1_a?
    REPLACE?
    FIELDS TERMINATED BY ','?
    TRAILING NULLCOLS?
    (DEPTNO,??
    ?DNAME "upper(:dname)",??
    ?LOC "upper(:loc)",??
    ?LAST_UPDATED Date 'dd/mm/yyyy',
    ?ENTIRE_LINE?
    )?
    demo17.dat?
    10,Sales,Virginia,01/01/2001,This is the Sales?
    Office in Virginia|
    20,Accounting,Virginia,13/04/2001,This is the Accounting?
    Office in Virginia|
    30,Consulting,Virginia,14/04/2001,This is the Consulting?
    Office in Virginia|
    40,Finance,Virginia,14/04/2002,This is the Finance?
    Office in Virginia
    ?
    注意:同樣需要在外部文件數據導入中使用,且最后一個不用加;另外注意不要有空格

    ?
    10、nullif導入
    ?
    LOAD DATA
    INFILE *
    INTO TABLE?t1_a
    REPLACE
    (DEPTNO position(1:2) integer external nullif DEPTNO='1',
    ?--當導入deotno的值為'1'時,則該條記錄不導入
    ?DNAME position(3:8)
    )
    BEGINDATA
    1 10
    20lg
    ?
    注:需要注意的是在前面指定的數據類型以及后面的引號!
    ?
    ?
    ?
    ?
    ?
    ?
    ==========================================================================================================
    ?
    ?
    Oracle SQL*Loader 使用指南(轉載)
    ?

    如何使用 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? --似乎不行?需要在DOS層級下操作才有效
    (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),而直接將數據導入到數據文件中。?
    ?
    ?




    -The End-

    posted on 2008-12-26 22:32 decode360-3 閱讀(1294) 評論(1)  編輯  收藏 所屬分類: Oracle

    評論

    # re: SQLLDR應用舉例 2009-05-08 08:30 游客
    很實用!  回復  更多評論
      

    主站蜘蛛池模板: 热99RE久久精品这里都是精品免费| 老妇激情毛片免费| 日本亚洲欧洲免费天堂午夜看片女人员 | 亚洲精品无码国产| 久久免费观看视频| 亚洲无人区午夜福利码高清完整版| jizz在线免费观看| 久久久久久久久免费看无码| 国产福利电影一区二区三区,亚洲国模精品一区 | 国产yw855.c免费视频| 色窝窝亚洲av网| 精品免费人成视频app| 亚洲天堂电影在线观看| 一二三四影视在线看片免费 | 亚洲AV无码专区在线亚| 成年女人男人免费视频播放| 亚洲αv在线精品糸列| 日本在线看片免费人成视频1000| 久久精品九九亚洲精品| 久久久久久噜噜精品免费直播| 久久久久国产成人精品亚洲午夜 | 美女视频黄视大全视频免费的| 亚洲精品老司机在线观看| 亚洲H在线播放在线观看H| 国内外成人免费视频| 亚洲最新黄色网址| 妞干网手机免费视频| 国产精品免费在线播放| 亚洲av日韩av不卡在线观看| 国产日韩精品无码区免费专区国产 | 亚洲国产精品无码中文lv| 亚洲国产成人久久一区久久| a在线视频免费观看| 亚洲人成网网址在线看| 91九色老熟女免费资源站| 亚洲爆乳少妇无码激情| 国产成人综合亚洲AV第一页 | 亚洲男人在线无码视频| 久久国产免费观看精品3| 亚洲AV综合色区无码一区爱AV| 日本XXX黄区免费看|