塗抹ORACLE-第5章-SQL*Loader 之一千零一十一個怎麼辦(2)

junsansi發表於2009-12-28

5.3.5 資料檔案中的列比要匯入的表中列少怎麼辦

  提出這樣的問題,說明你沒有認真看我們前面的示例,對,前面你睡著了,OK,那就清醒一下,重新檢視一下表結構:

    SQL> DESC BONUS;

     名稱    是否為空?  型別

     ----------------  --------  ----------------------------

     ENAME  VARCHAR2(10)

     JOB    VARCHAR2(9)

     SAL    NUMBER

     COMM   NUMBER

  之前的諸多演示,正是在資料檔案中列比表中列要少的環境下建立的,這說明列少不怕,關鍵是看控制檔案中的配置。考慮下面一種情況,如果缺少的列必須賦值又怎麼辦呢?沒有關係,稍改下控制檔案即可,直接指定COMM列,並賦初始值0(這裡仍然引用ldr_case3.dat中的資料):

    LOAD DATA

    INFILE ldr_case3.dat

    TRUNCATE INTO TABLE BONUS

    (

    ENAME position(1:5),

    JOB position(7:15),

    SAL position(17:20),

    COMM "0"

    )

  示例程式碼儲存為控制檔案ldr_case4.ctl。

  執行SQLLDR命令:

    F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE4.CTL

    SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 17:01:01 2009

    Copyright (c) 1982, 2007, Oracle.  All rights reserved.

    達到提交點 - 邏輯記錄計數 3

    達到提交點 - 邏輯記錄計數 4

  SQL*Plus中檢視匯入結果:

    SQL> SELECT * FROM BONUS;

    ENAME    JOB  SAL         COMM

    ---------- ----------  ----------  -----------

    SMITH     CLEAK        3904         0

    ALLEN    SALESMAN    2891         0

    WARD     SALESMAN    3128          0

    KING      PRESIDENT     2523          0

  可以再玩兒點更有難度的,根據SAL的值設定COMM列的值,修改控制檔案如下:

    LOAD DATA

    INFILE ldr_case3.dat

    TRUNCATE INTO TABLE BONUS

    (

    ENAME position(1:5),

    JOB position(7:15),

    SAL position(17:20),

    COMM "substr(:SAL,1,1)"

    )

  示例程式碼儲存為控制檔案ldr_case5.ctl。

  執行SQLLDR命令:

    F:\oracle\SCRIPT>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE5.CTL

    SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 17:13:59 2009

    Copyright (c) 1982, 2007, Oracle.  All rights reserved.

    達到提交點 - 邏輯記錄計數 3

    達到提交點 - 邏輯記錄計數 4

  SQL*Plus中檢視匯入結果:

    SQL> SELECT * FROM BONUS;

    ENAME    JOB            SAL      COMM

    ----------  -------------------- ----------  ----------

    SMITH       CLEAK         3904      3

    ALLEN       SALESMAN     2891      2

    WARD        SALESMAN     3128      3

    KING        PRESIDENT     2523      2

  這裡COMM列的值根據SAL列值而定,我們通過一個SQL中的函式substr取SAL值的第一列,賦予COMM列,當然這只是一個示例,DBA可以根據實際需求進行適當的修改,通過SQL中的函式可以實現很多很有意思的轉換,也許能夠為你省下很大力氣,而且如果現有函式無法實現,甚至可以通過PL/SQL編寫自定義的函式,然後在SQLLDR的控制檔案中呼叫,呼叫方式與系統自帶函式方式完全相同,這樣就可以根據需求對要載入的列做更靈活的處理。

5.3.6 資料檔案中的列比要匯入的表中列多怎麼辦

  如果資料檔案中的列比要匯入的表中的列少,處理的時候可能麻煩些,多了反倒更簡單,針對不同情況,一般有以下兩種處理方式:

  方式一:修改資料檔案,將多餘的資料刪除,不過以這種方式處理,小資料量時還算可行,一旦資料檔案較大,幾百兆甚至上千兆,修改資料檔案耗時耗力,這時我們就需要Plan B。

  方式二:比如,資料檔案如下(同樣是基於只做演示的目的,這裡三思就不真的提供幾百兆甚至上千兆的資料了,不然出版社非把我活吞了不可):

    SMITH   7369  CLERK      800   20

    ALLEN   7499  SALESMAN   1600  30

    WARD    7521  SALESMAN   1250  30

    JONES   7566  MANAGER    2975  20

    MARTIN  7654  SALESMAN   1250  30

    BLAKE   7698  MANAGER    2850  30

    CLARK  7782  MANAGER    2450  10

    KING    7839  PRESIDENT  5000  10

    TURNER  7844  SALESMAN   1500  30

    JAMES   7900  CLERK      950   30

    FORD    7902  ANALYST    3000  20

    MILLER  7934  CLERK      1300  10

  示例程式碼儲存為資料檔案ldr_case6.dat。

  我們希望匯入第1、3、4列而跳過2、5兩列(注意這裡指的不是字元列),建立控制檔案如下:

    LOAD DATA

    INFILE ldr_case6.dat

    TRUNCATE INTO TABLE BONUS

    (

    ENAME position(1:6),

    TCOL FILLER position(8:11),

    JOB position(13:21),

    SAL position(23:26)

    )

  示例程式碼儲存為控制檔案ldr_case6.ctl。

  SQLLDR的控制檔案中對列定義時支援FILLER關鍵字,可以用來指定過濾列,在上述控制檔案中,我們就使用該關鍵字來過濾列,相當於第8到第11列之間的資料不匯入。

  事實上由於此處為定長字串,我們在控制檔案中指定的position引數,已經限定了讀取的內容,你甚至可以刪除控制檔案中TCOL FILLER position(8:11)那行。 

  執行SQLLDR命令:

    F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE6.CTL

    SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 23:13:33 2009

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    達到提交點 - 邏輯記錄計數 11

    達到提交點 - 邏輯記錄計數 12

  SQL*Plus中檢視匯入結果:

    SQL> SELECT * FROM BONUS;

    ENAME       JOB             SAL       COMM

    ----------  ---------  ---------  ----------

    SMITH       CLERK           800

    ALLEN       SALESMAN        1600

    WARD        SALESMAN        1250

    JONES       MANAGER         2975

    MARTIN      SALESMAN        1250

    BLAKE       MANAGER         2850

    CLARK       MANAGER         2450

    KING        PRESIDENT       5000

    TURNER      SALESMAN        1500

    JAMES       CLERK           950

    FORD        ANALYST         3000

    MILLER      CLERK           1300

  結果符合要求,不過,如果資料檔案中字串不是定長格式,而是通過分隔符來處理的,那控制檔案中就需要注意,如資料檔案如下:

    SMITH,7369,CLERK,800,20

    ALLEN,7499,SALESMAN,1600,30

    WARD,7521,SALESMAN,1250,30

    JONES,7566,MANAGER,2975,20

    MARTIN,7654,SALESMAN,1250,30

    BLAKE,7698,MANAGER,2850,30

    CLARK,7782,MANAGER,2450,10

    KING,7839,PRESIDENT,5000,10

    TURNER,7844,SALESMAN,1500,30

    JAMES,7900,CLERK,950,30

    FORD,7902,ANALYST,3000,20

    MILLER,7934,CLERK,1300,10

  示例程式碼儲存為資料檔案ldr_case7.dat。

  建立控制檔案,此時控制檔案中必須指定FILLER,不然列值就有可能不對應。例如,建立控制檔案如下:

    LOAD DATA

    INFILE ldr_case7.dat

    TRUNCATE INTO TABLE BONUS

    FIELDS TERMINATED BY ","

    (ENAME,TCOL FILLER,JOB,SAL)

    示例程式碼儲存為控制檔案ldr_case7.ctl。

  執行SQLLDR命令:

    F:\oracle\script>SQLLDR SCOTT/TIGER CONTROL=LDR_CASE7.CTL

    SQL*Loader: Release 10.2.0.1.0 - Production on 星期三 3月 11 23:27:21 2009

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    達到提交點 - 邏輯記錄計數 11

    達到提交點 - 邏輯記錄計數 12

  SQL*Plus中檢視匯入結果:

    SQL> SELECT * FROM BONUS;

    ENAME     JOB           SAL        COMM

    ---------- ---------  ---------  ----------

    SMITH       CLERK        800

    ALLEN       SALESMAN     1600

    WARD        SALESMAN     1250

    JONES       MANAGER      2975

    MARTIN      SALESMAN     1250

    BLAKE       MANAGER      2850

    CLARK       MANAGER      2450

    KING        PRESIDENT     5000

    TURNER      SALESMAN     1500

    JAMES       CLERK         950

    FORD        ANALYST       3000

    MILLER      CLERK         1300

竣工~~~

=================================================
全書目錄:http://space.itpub.net/7607759/viewspace-622699
樣書預覽:http://space.itpub.net/7607759/viewspace-622515
馬上購買:http://www.china-pub.com/196252

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-623704/,如需轉載,請註明出處,否則將追究法律責任。

相關文章