[Oracle] SQL*Loader 詳細使用教程(3)- 控制文件

控制文件是SQL*Loader裏最重要的文件,它是一個文本文件,用來定義數據文件的位置、數據的格式、以及配置數據加載過程的行爲,在sqlldr中以control參數指定控制文件。sql

 

在控制文件裏配置命令行參數 (OPTIONS)

在上一篇中咱們講過命令行參數能夠配置在三個地方,其中一個就是可使用控制文件的OPTIONS字句(這也是最經常使用的方式),以下所示:數據庫

 

OPTIONS (DIRECT=true, SILENT=(ERRORS, FEEDBACK) )

更多的命令行參數,請見上一篇。spa

 

配置數據文件(INFILE)

 

使用INFILE能夠配置一個或多個數據文件,其語法以下:操作系統

若是數據包含在控制文件自己,則用*表示,如:.net

 

INFILE  *
在控制文件的末尾,以BEGINDATA開頭,後面接數據:

 

 

BEGINDATA 
data

若是你有多個數據文件怎麼辦?很簡單,只要多個INFILE便可,並且還能夠爲每一個INFILE指定各自的錯誤文件和丟棄文件等,以下所示:命令行

 

INFILE  mydat1.dat  BADFILE  mydat1.bad  DISCARDFILE mydat1.dis 
INFILE  mydat2.dat 
INFILE  mydat3.dat  DISCARDFILE  mydat3.dis 
INFILE  mydat4.dat  DISCARDMAX  10 0

 

字符集

若是數據文件的字符集和數據庫的字符集不同,SQL*Loader會自動把數據文件的字符集轉換成數據庫的字符集,固然前提條件是數據庫的字符集是數據文件的字符集的超集。

數據庫的字符集能夠經過如下SQL語句查詢:
[sql]  view plain  copy
 
 print?
  1. select * from nls_database_parameters;  
數據文件的字符集能夠經過控制文件中的CHARACTERSET參數配置,其語法以下:
CHARACTERSET char_set_name 
若是沒有設置CHARACTERSET參數,數據文件的字符集由操做系統的NLS_LANG設置。
受到字符集影響的數據類型有:CHAR,VARCHAR,numeric EXTERNAL, datetime, interval

還有一種字符集要特別注意,就是控制文件自己的字符集(只能由NLS_LANG設置),若是控制文件的字符集和數據文件的不同,會先轉換成數據文件的字符集,但這樣很容易出錯(特別是分隔符),所以,實際使用中爲了方便,通常把NLS_LANG,CHARACTERSET(若是有的話)設成和數據庫字符集同樣。code

 

數據加載方式(INSERT, APPEND, REPLACE, TRUNCATE)

默認狀況下,SQL*Loader是以INSERT方式加載數據,目標表必須是空表,不然會報錯;blog

若是目標表爲非空表,則必須指定以下的三種方式之一:教程

1. APPEND:添加數據至源數據的後面ip

2. REPLACE:在添加數據以前,先執行DELETE FROM TABLE把表清空,注意:這裏的REPLACE是表級別的替代,而不是行級別

3. TRUNCATE:在添加數據以前,先執行TRUNCATE TABLE table_name REUSE STORAGE 

從上面咱們能夠知道,SQL*Loader不支持對已存在的行更新,若是你想更新已存在的行,則必須先把數據加載至一個空的中間表,而後在原表和中間表進行關聯update

若是你想把記錄插入到多個表中,可使用多個INTO TABLE,舉個例子:

 

1 50   Manufacturing       — DEPT record 
2 1119 Smith      50       — EMP record 
2 1120 Snyder     50 
1 60   Shipping 
2 1121 Stevens    60 
數據文件如上所示,根據第一列的值插入到不一樣的表中:
INTO TABLE dept 
   WHEN recid = 1 
   (recid  FILLER POSITION(1:1)  INTEGER EXTERNAL,
    deptno POSITION(3:4)  INTEGER EXTERNAL, 
    dname  POSITION(8:21) CHAR) 
INTO TABLE emp 
   WHEN recid <> 1 
   (recid  FILLER POSITION(1:1)   INTEGER EXTERNAL,
    empno  POSITION(3:6)   INTEGER EXTERNAL, 
    ename  POSITION(8:17)  CHAR, 
    deptno POSITION(19:20) INTEGER EXTERNAL) 

數據過濾(WHEN)

咱們能夠用WHEN字句篩選須要的記錄,不符合WHEN條件的記錄將被丟棄,WEHN的語法以下:

下面是一個例子:
WHEN (deptno = '10') AND (job = 'SALES') 

 

 

 

設置字段分隔符(WHEN)

 

若是全部的字段分隔符都同樣,能夠設置一個默認的分隔符,其語法以下:


下面是一個例子:

 

FIELDS TERMINATED BY WHITESPACE
 

 

 

沒法匹配的字段用NULL填充(TRAILING NULLCOLS)

 

若是數據文件中記錄的列少於目標表的列,最好用NULL代替,不然會報錯,以下所示:

 

INTO TABLE dept 
    TRAILING NULLCOLS 
( deptno CHAR TERMINATED BY " ", 
  dname  CHAR TERMINATED BY WHITESPACE, 
  loc    CHAR TERMINATED BY WHITESPACE 
) 
記錄格式以下:

 

10 Accounting 
對於如上的這條記錄,loc列的值爲NULL。

 

控制文件示例

下面是一個控制文件的例子:

 

[plain]  view plain  copy
 
 print?
  1. OPTIONS (DIRECT=true,SKIP_INDEX_MAINTENANCE=true,PARALLEL=true)  
  2. LOAD DATA  
  3. INFILE 'nor.dat'  
  4. BADFILE 'nor.bad'  
  5. DISCARDFILE 'nor.dsc'  
  6. INTO TABLE p95169.DISEASE_EXPERT_RELATION  
  7. APPEND  
  8. WHEN len='3'  
  9. FIELDS TERMINATED BY WHITESPACE  
  10. (  
  11.   len FILLER POSITION(1) CHAR,  
  12.   DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",  
  13.   EXPERTUUID CHAR,  
  14.   DISEASEUUID CHAR,  
  15.   DISEASESORTCODE EXPRESSION "NULL",  
  16.   DISEASENAME CHAR,  
  17.   CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",  
  18.   MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"  
  19. )  
  20. INTO TABLE p95169.DISEASE_EXPERT_RELATION  
  21. APPEND  
  22. WHEN len='2'  
  23. FIELDS TERMINATED BY WHITESPACE  
  24. (  
  25.   len FILLER POSITION(1) CHAR,  
  26.   DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",  
  27.   EXPERTUUID CHAR,  
  28.   DISEASEUUID EXPRESSION "NULL",  
  29.   DISEASESORTCODE EXPRESSION "NULL",  
  30.   DISEASENAME CHAR,  
  31.   CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",  
  32.   MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"  
  33. )  
  34. INTO TABLE p95169.DISEASE_EXPERT_RELATION  
  35. APPEND  
  36. WHEN len='1'  
  37. FIELDS TERMINATED BY WHITESPACE  
  38. (  
  39.   len FILLER POSITION(1) CHAR,  
  40.   DISEASEEXPERTUUID EXPRESSION "SYS_GUID()",  
  41.   EXPERTUUID CHAR,  
  42.   DISEASEUUID EXPRESSION "NULL",  
  43.   DISEASESORTCODE EXPRESSION "NULL",  
  44.   DISEASENAME EXPRESSION "NULL",  
  45.   CREATEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')",  
  46.   MODIFIEDTIME EXPRESSION "TO_CHAR(sysdate,'yyyymmddhh24miss')"  
  47. )  

 

 

 

[Oracle] SQL*Loader 詳細使用教程(4)- 字段列表

 

 

 

 
6
相關文章
相關標籤/搜索