ORACLE->SQL*Loader[20180712]

 
    SQL*Loader將外部文件的數據加載到Oracle數據庫的表中。它具備強大的數據解析引擎,對數據文件中的數據格式沒有太多的限制。
    SQL*Loader可執行如下操做:
        -若是數據文件與數據庫不在同一系統上,則經過網絡加載數據。
        -在同一會話中能夠加載來自多個數據文件的數據。
        -在同一加載會話期間可將數據文件的時間加載到多個表中。
        -可指定數據的字符集
        -選擇性加載數據
        -使用SQL函數在加載數據以前操做數據
        -在指定的列中生成惟一的序列值
        -使用操做系統的文件系統訪問數據文件
        -從磁盤,磁帶或命名管道加載數據
        -生成錯誤報告幫助解決問題
        -加載任意複雜的對象關係數據
        -使用輔助數據文件來加載LOB和集合
        -使用傳統或直接路徑加載。雖然傳統的路徑加載很是靈活,但直接路徑加載提供了出色的性能
 
SQL*Loader 參數
        sqlldr命令,能夠調用SQL*Loader
        參數能夠和參數文件中組合在一塊兒。而後使用parfile參數指定參數文件的名稱
        某些參數也能夠經過使用options子句在SQL*Loader控制文件中指定
        在命令行中指定的參數將覆蓋參數文件或options子句中指定的任何參數值
 
    輸入數據文件
        SQL*Loader從控制文件中指定的一個或多個文件(或操做系統的等效文件)中讀取數據。從SQL*Loader的角度看,數據文件中的數據是按記錄組織的。一個特定的數據文件可採用固定記錄格式、可變記錄格式或流記錄格式。可經過控制文件中INFILE參數指定記錄格式。若是未指定記錄格式,默認格式爲流記錄格式。
   
    SQL*Loader控制文件
            控制文件是一個文本文件,它是使用SQL*Loader可識別的語言編寫的。控制文件指示SQL*Loader在何處查找數據、若是分析和解釋數據以及何處插入數據等等。
            控制文件包含三個段
               第一個段包含如下所示的會話範圍信息
                -全局選項,如輸入數據文件名和要跳過的記錄
                -用於指定輸入數據位置的INFILE子句
                -要加載的數據
               第二個段包括一個或多個INTO TABLE塊。其中每一個一塊都包含要字在其中加載數據的表的信息(如表名和表列)
               第三個段是可選段,若是存在,則其中包含輸入數據       
   
    SQL*Loader日誌文件
            SQL*Loader開始執行時,會建立日誌文件。若是不能建立日誌文件,執行就會終止。日誌文件包含加載操做的詳細說明,包含加載過程當中發生的任何錯誤的說明。
    SQL*Loader 壞文件
            壞文件中包含被SQL*Loader或Oracle DB拒絕的記錄。當輸入格式無效時,SQL*Loader就會拒絕數據文件記錄。SQL*Loader接受處理某一數據文件記錄後,會將該數據文件發送到Oracle DB。以便可以做爲一行插入到表中。若是Oracle DB肯定該行有效,就會將該行插入到表中;若是肯定該行無效,則會拒絕該記錄,而後SQL*Loader會將該記錄放入壞文件中。
    SQL*Loader放棄文件
            僅當須要這種文件而且指定了啓用放棄文件時,纔會建立此文件。放棄文件中包含的記錄是因不符合控制文件指定的任何記錄選擇標準而從加載文件中過濾掉的記錄。
 
SQL*Loader控制文件通知SQL*Loader如下信息
        要加載數據的位置
        數據格式
        配置詳細資料
            -內存管理
            -記錄拒絕
            -中斷的加載處理詳細資料
    數據操做詳細資料
    SQL*Loader控制文件是一個文本文件,其中包含數據定義語言(DDL)指令.DDL用來控制SQL*Loader會話的如下方面:
        -SQL*Loader在何處查找要加載的數據
        -SQL*Loader但願如何肯定數據的格式
        -SQL*Loader在加載數據時採用了那些配置(包括內存管理,選擇與拒絕標準,中斷的加載處理等等)
        -SQL*Loader如何處理正在加載的數據
       
 
       
 
SQL*Loader加載方法
   
        直接路徑加載與常規路徑加載的比較
            常規路徑加載經過執行SQL INSERT語句,將表填充到ORACLE DB中.直接路徑加載經過格式化oracle數據塊並將其直接寫入數據庫文件,消除了大部分Oracle DB開銷。直接加載不與其餘用戶爭用數據庫資源,所以其數據加載速度一般與磁盤速度相差無幾。常規路徑加載使用SQL處理和數據庫COMMIT操做來保存數據。插入記錄數組後要執行COMMIT操做。每次數據加載可能涉及多個事務處理。
            直接路徑加載使用數據保存將數據塊寫入Oracle數據文件。這就是爲何直接路徑加載比常規路徑加載快不少的緣由。經過如下特性可區分數據保存與COMMIT的差別:
                -在數據保存期間,只有完整的數據塊才寫入數據庫中
                -這些塊是在按照表的高水位標記(HWM)寫入的
                -完成數據保存後,HWM會移動
                -完成數據保存後不會釋放內部資源
                -完成數據保存後不會結束事務處理
                -每次執行數據保存時不會更新索引
 
 
SQL*Loader測試
           加載數據和數據文件
Fixed Record Format 
固定長度 INFILE datafile_name "fix n"
固定11個字節
[oracle@pcqtestxi01 ~]$ cat example.ctl example.dat
----example.ctl ----
load data
infile 'example.dat' "fix 11"
into table example
fields terminated by ',' optionally enclosed by '"'
(col01,col02)
----example.dat ----
001,   cd, 0002,fghi,
00003,lmn,
1, "pqrs",
0005,uxwx,
[oracle@pcqtestxi01 ~]$ sqlldr monitor/password control=example.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Jun 12 11:45:16 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Commit point reached - logical record count 5
查詢加載成功的數據
SQL>  select * from dbmonitor.example;
COL01 COL02
----- --------------------------------------------------
001   cd
0002  fghi
00003 lmn
1     pqrs
0005  uxwx
          
Variable Record Format
 變量記錄格式 INFILE datafile_name  "var n"
[oracle@pcqtestxi01 ~]$ cat example01.ctl example01.dat
 ----example01.ctl------
load data
infile 'example01.dat' "var 3"
into table example
fields terminated by ',' optionally enclosed by '"'
(col01 char(5),
col02 char(7))
----example01.dat------
009hello,cd,010world,im,
012my,name is,
[oracle@pcqtestxi01 ~]$ sqlldr monitor/password control=example01.ctl
SQL*Loader: Release 11.2.0.4.0 - Production on Tue Jun 12 11:41:03 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Commit point reached - logical record count 3
[oracle@pcqtestxi01 ~]$ dba
SQL*Plus: Release 11.2.0.4.0 Production on Tue Jun 12 11:41:06 2018
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>  select * from dbmonitor.example;
COL01 COL02
----- --------------------------------------------------
hello cd
world im
my    name is
       
Stream Record Format
流記錄格式 INFILE datafile_name ["str terminator_string"]
terminator_string被指定爲'char_string'或X'hex_string',其中:
    'char_string'是用單引號或雙引號括起來的字符串
     X'hex_string'是一個十六進制格式的字節串
  當terminator_string包含特殊(不可打印)字符時,應該將其指定X'hex_string。可是經過使用反斜槓,能夠將一些不可打印的字符指定爲(‘char_string’)
\ n表示換行
\ t表示一個水平標籤
\ f表示換頁
\ v表示一個垂直選項卡
\ r表示回車
SQL*Loader 命令行參數
 
     CONTROL   指定控制文件名稱
     OPTIONS     條件選項 OPTIONS (BINDSIZE=100000, SILENT=(ERRORS, FEEDBACK) )
     PARAMETER    參數文件
     命令行參數
           BAD   指定壞文件名稱
           BINDSIZE     指定BIND數組最大的字節,它的默認值 依賴操做系統和ROWS數
           COLUMNARRAYROWS   指定爲直接路徑分配的行數,必須指定它或接受默認值
           DATA 數據文件,在控制文件INFILE中指定,若是命令行中指定了數據文件,則會忽略控制文件中的第一個數據文件
           DATE_CACHE  日期緩存,用於存儲從文本字符串到內部日期格式的轉換結果。若是數據文件中重複出現相同的日誌,則使用日期緩存能夠提升直接路徑加載的速度。默認值1000,只適用於直接路徑加載
           DIRECT  直接路徑加載,默認值false 不啓用,true 啓用
           DISCARD     丟棄文件,指用於存儲既不插入表也不被拒接的記錄
           DISCARDMAX   指定在數據加載終止以前容許的丟棄記錄數。默認值ALL
           ERRORS     指定容許的最大插入錯誤數量。若是錯誤數量超過了ERRORS指定的值,那麼SQL*Loader終止加載
           EXTERNAL_TABLE     指示SQL*Loader是否使用外部表選項加載數據
                NOT_USED       默認值。使用常規或直接路徑模式執行
                GENERATE_ONLY           在SQL*Loader日誌文件中放置使用外部表進行加載所需的全部SQL語句,不會真實執行。
                EXECUTE          嘗試執行使用外部表執行裝入所需的SQL語句
           FILE   要加載到的表空間文件。它僅用於直接路徑並行加載
           LOAD      指定要加載的邏輯記錄的最大數量(跳過指定數量以後的記錄)
           LOG        指定SQL*Loader將建立的日誌文件,存儲加載過程的日誌記錄
           MULTITHREADING      多線程功能,多CPU系統上爲true,單CPU系統上爲false。該參數僅適用於直接路徑加載
           PARALLEL        並行度
           PARFILE      指定包含經常使用命令行參數的文件名稱
           READSIZE   讀取緩衝區大小,較大的讀取緩衝區的優勢是在須要提交操做以前能夠讀取更多的數據
           RESUMABLE    用於啓用和禁用可恢復的空間分配,默認值false
           RESUMABLE_NAME        此參數的值標識可恢復的語句。此值會插入到USER_RESUMABLE或DBA_RESUMABLE視圖中,用於幫助識別已暫停的特定可恢復語句。除非RESUMNABLE爲true,不然將忽略此參數
           RESUMABLE_TIMEOUT        指定必須修正錯誤的時間段。若是錯誤在超時期限內沒有解決,語句執行就會終止,而不會結束。除非RESUMNABLE爲true,不然將忽略此參數。默認值 7200秒,2小時
           ROWS    每次提交的行數。
                     僅限傳統路徑加載:ROWS指定數組中的行數
                     僅限直接路徑加載:ROWS標識在數據保存以前要從數據文件讀取的行數。
           SILENT    反饋消息,   SILENT=(HEADER, FEEDBACK)
                     HEADER      抑制SQL*Loader標頭消息
                     FEEDBACK       禁止已提交的反饋信息
                     ERRORS     禁止數據錯誤信息
                     DISCARDS        禁止丟失信息
                     PARTITIONS     直接加載分區表期間禁用將每分區統計信息寫入日誌文件
                     ALL     抑制全部值,HEADER、FEEDBACK、ERRORS、DISCARDS和PRATITIONS
 
           SKIP  記錄跳過,該參數繼續因爲某種緣由而中斷的加載
           SKIP_INDEX_MAINTENANCE     默認值false,中止直接路徑加載對索引維護,但不適用用於常規路徑加載。
                     適用於本地和全局索引
                     可使用PARALLEL參數,對具備索引對象執行並行加載
                     可使用INTO TABLE子句中的PARTITION參數,對具備全局索引的表執行單個分區加載
                     將加載設置爲索引不可用狀態的索引和索引分區的列表
           SKIP_UNUSABLE_INDEXES      默認值true,若是遇到索引不可用狀態下的索引,則會跳過該索引並繼續加載操做
           STREAMSIZE         指定直接路徑流的大小(以字節爲單位)
           USERID        用於提供Oracle用戶名和密碼,若是省略則會提示輸入,若是以SYS身份鏈接,則必須指定AS SYSDBA    
 
           退出時檢查和顯示代碼,不一樣平臺提示的數值代碼
 
Result
Exit Code
All rows loaded successfully
EX_SUCC
All or some rows rejected
EX_WARN
All or some rows discarded
EX_WARN
Discontinued load
EX_WARN
Command-line or syntax errors
EX_FAIL
Oracle errors nonrecoverable for SQL*Loader
EX_FAIL
Operating system errors (such as file open/close and malloc)
EX_FAIL
 
For UNIX, the exit codes are as follows:
 
EX_SUCC 0
EX_FAIL 1
EX_WARN 2
EX_FTL  3
For Windows NT, the exit codes are as follows:
 
EX_SUCC 0
EX_FAIL 1
EX_WARN 2
EX_FTL  4
 
內容領域
     控制數據的領域,position(1:2)截取字符1到2位置,做爲一個字段
.
.
.
1  (hiredate  SYSDATE,
2     deptno  POSITION(1:2)  INTEGER EXTERNAL(2)              NULLIF deptno=BLANKS,
3     job   POSITION(7:14)  CHAR  TERMINATED BY WHITESPACE               NULLIF job=BLANKS  "UPPER(:job)",
       mgr    POSITION(28:31) INTEGER EXTERNAL               TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS,
       ename  POSITION(34:41) CHAR               TERMINATED BY WHITESPACE  "UPPER(:ename)",
       empno  POSITION(45) INTEGER EXTERNAL                TERMINATED BY WHITESPACE,
       sal    POSITION(51) CHAR  TERMINATED BY WHITESPACE               "TO_NUMBER(:sal,'$99,999.99')",
4     comm   INTEGER EXTERNAL  ENCLOSED BY '(' AND '%'              ":comm * 100"  )
 
SQL*Loader Field List Reference
(用於指定數據截取、類型和限制)
     1.Field List Contents
(數據內容格式)
           (字段名 截取範圍 類型|類型)
           POSITION(start:end) 指定截取字符範圍
                INTEGER EXTERNAL(類型,整型)
                     NULLIF(空時賦初始值)
           TERMINATED BY WHITESPACE(分隔符)
           ENCLOSED BY(結束符)
     2.Specifying the position of a data filed
(指定數據所在範圍)
           語法:(start|*/+integer :或- end)
                start 開始位置
                end 結束位置
                * 從前面位置之後的
                +integer 指定取多少值
     3.Specifying columns and fields
(指定字段和列)
           Specifying filler  fields(填充字段)
                BOUNDFILLER或FILLER指定填充字段
                規則
                     填充字段的語法與基於列的字段語法相同,只是填充段的名稱後跟上填充字符
                     填充字段具備名稱,但它們未加載到表中
                     填充字段可用做init_spec的參數(如NULL和DEFAULTIF)
                     填充字段可用做指令的參數(如SID、OID、REF和BFILE)
                注意事項
                     填充字段可用於NULLIF、DEFAULT和WHEN子句中的字段條件規範。可是它們不能在SQL字符串中使用
                     填充字符規範不能包含NULLIF或DEFAULT子句
                     若是指定並適用TRAILING NULLCOLS,則填充字段將初始化爲NULL.若是另外一個字段引用了無效的填充字段,則會生成錯誤
                     填充字段能夠出如今數據文件中的任何位置,包含對象的字段列表內或VARRAY的定義內
                     SQL字符串不能指定爲填充字段規範的一部分,由於沒有綁定數組中的填充程序分配空間
     4.SQL*Loader datatypes
(數據類型)
           Nonportable Datatypes
(不可移植數據類型)
                數值類型
                     INTEGER(n:1,2,4,8) 全二進制整數
                     SMALLINT 半二進制整數
                     FLOAT 單精度浮點二進制數
                     DOUBLE 雙精度浮點二進制數
                     BYTEINT 二進制表的十進制值,BYTEINT長度始終爲1
                     ZONED 分區十進制數
                     DECIMAL 壓縮十進制數
                長數值類型
                     VARGRAPHIC 變長的雙字節字符集
                     VARCHAR 字符串
                     VARRAW 一個2字節的二進制和一個RAW字符串組成
                     LONG VARRAW 具備4個字節長度的子字段(VARRAW)
           Portable Datatypes
(可移植數據類型)
                數值類型
                     CHAR (CHAR length delim_spec)
                     Datetime and Interval
                           DATE
                           TIME
                           TIME WITH TIME ZONE
                           TIMESTAMP
                           TIMESTAMP WITH TIME ZONE
                           TIMESTAMP WITH LOCAL TIME ZONE
                           INTERVAL YEAR TO MONTH
                           INTERVAL DAY TO SECOND
                     GRAPHIC 雙字節字符集 graphic graphic_char_length
                     GRAPHIC EXTERNAL 雙字節字符集
                     Numeric EXTERNAL(INTEGER,FLOAT,DECIMAL,ZONED)
                     RAW 原二進制數據
                長數據類型
                     VARCHARC 字符長度子字段和字符串值子字段組成
                     VARRAWC 由RAW字符串子字段組成
 
Table 9-2 Datatype Conversions for Datetime and Interval Datatypes
 
SQL*Loader Datatype
Oracle Database Datatype (Conversion Support)
N
N (Yes), C (Yes), D (No), T (No), TS (No), YM (No), DS (No)
C
N (Yes), C (Yes), D (Yes), T (Yes), TS (Yes), YM (Yes), DS (Yes)
D
N (No), C (Yes), D (Yes), T (No), TS (Yes), YM (No), DS (No)
T
N (No), C (Yes), D (No), T (Yes), TS (Yes), YM (No), DS (No)
TS
N (No), C (Yes), D (Yes), T (Yes), TS (Yes), YM (No), DS (No)
YM
N (No), C (Yes), D (No), T (No), TS (No), YM (Yes), DS (No)
DS
N (No), C (Yes), D (No), T (No), TS (No), YM (No), DS (Yes)
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息