Decode360's Blog

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          SQL*Loader使用介紹
          ?
          ?
          ??? 今天學習一下使用SQL*Loader導入數據的方法。首先看一下對于SQLLDR命令的介紹:
          ?
          ??? SQL_Loader
          ?
          ?
          1、SQL*Loader的基本特點:
          ?
          ??? 01. 能裝入不同數據類型文件及多個數據文件的數據
          ??? 02. 可裝入固定格式、自由定界以及可度長格式的數據
          ??? 03. 可以裝入二進制,壓縮十進制數據
          ??? 04. 一次可對多個表裝入數據
          ??? 05. 連接多個物理記錄裝到一個記錄中
          ??? 06. 對一單記錄分解再裝入到表中
          ??? 07. 可以用?數對制定列生成唯一的Key
          ??? 08. 可對磁盤或磁帶數據文件裝入制表中
          ??? 09. 提供裝入錯誤報告
          ??? 10. 可以將文件中的整型字符串,自動轉成壓縮十進制并裝入列表中。
          ?
          2、SQL*Loader各類文件說明:
          ?
          ??? ① 控制文件
          ??????? SQL*Loader根據控制文件找到需要加載的數據,并且分析和解釋這些數據。控制文件由三個部分組成:
          ??????? 01. 全局選件、行、跳過的記錄數等;
          ??????? 02. INFILE子句指定的輸入數據;
          ??????? 03. 數據特性的說明;
          ?
          ??? ② 輸入文件
          ??????? 需要在控制文件中指定輸入文件(INFILE)的格式,具體性質如下:
          ??????? 01. 正常指定文件格式 INFILE 'example.dat'
          ??????? 02. 若導入的數據直接在控制文件中,則用 INFILE * ... BEGINDATA ...
          ??????? 03. 若導入數據在其他文件中,且每條記錄定長,則使用 INFILE 'example.dat' "FIX 11"
          ??????? 04. 若導入數據在其他文件中,且每條記錄不定長,則使用 INFILE 'example.dat' "VAR 3"
          ???????? 注:長度包括分隔符,具體使用案例見下文
          ?
          ??? ③ 壞文件
          ??????? 壞文件包含那些被SQL*Loader拒絕的記錄,被拒絕的記錄可能是不符合要求的記錄。
          ??????? 壞文件的名字由SQL*Loader命令的BADFILE參數來給定。
          ??? ④ 日志文件及日志信息
          ??????? 當SQL*Loader開始執行后,它就自動建立日志文件。
          ??????? 日志文件包含有加載的總結,加載中的錯誤信息等。
          ?
          3、編寫控制文件
          ?
          控制文件的格式如下:
          ?
          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]
          ?
          ?
          說明:
          ?
          要加載的數據文件:
          ?
          ??? 01.INFILE和INDDN是同義詞,它們后面都是要加載的數據文件;如果用 * 則表示數據就在控制文件內;在INFILE后可以跟幾個文件;
          ??? 02.STRAM表示一次讀一個字節的數據。新行代表新物理記錄(邏輯記錄可由幾個物理記錄組成);
          ??? 03.RECORD使用宿主操作系統文件及記錄管理系統。如果數據在控制文件中則使用這種方法;
          ??? 0 4.FIXED length要讀的記錄長度為length字節;
          ??? 05.VARIABLE 被讀的記錄中前兩個字節包含的長度,length記錄可能的長度。缺省為8k字節;
          ??? 06.BADFILE和BADDN同義,存放Oracle不能加載數據到數據庫的那些記錄;
          ??? 07.DISCARDFILE和DISCARDDN是同義詞,記錄沒有通過的數據;
          ??? 0 8.DISCARDS和DISCARDMAX是同義詞,Integer為最大放棄的文件個數。
          ?
          ② 加載的方法:
          ?
          ??? 01.APPEND 給表添加行
          ??? 02.INSERT 給空表增加行(如果表中有記錄則退出)
          ??? 03.REPLACE 先清空表在加載數據
          ??? 04.RECLEN 用于兩種情況:
          ??????? 1> SQLLDR不能自動計算記錄長度
          ??????? 2> 或用戶想看壞文件的完整記錄時(Oracle只能按常規把壞記錄部分寫到錯誤的地方,如果看整條記錄,則可以將整條記錄寫到壞文件中)
          ?
          ③ 指定最大的記錄長度:
          ?
          ??? CONCATENATE允許用戶設定一個整數,表示要組合邏輯記錄的數目。
          ?
          建立邏輯記錄:
          ?
          ??? 01. THIS 檢查當前記錄條件,如果為真則連接下一個記錄。
          ??? 02. NEXT 檢查下一個記錄條件。如果為真,則連接下一個記錄到當前記錄來。
          ??? 03. start:end 表示要檢查在THIS或NEXT字串是否存在繼續串的列,以確定是否進行連接。
          ??????? 如:continueif next(1-3)='WAG' 或continueif next(1-3)=X'0d03if'
          ?
          指定要加載的表:
          ?
          ??? 01. INTO TABLE 要加的表名。
          ??? 02. WHEN 和select WHERE類似。用來檢查記錄的情況,如:when(3-5)='SSM' and (22)='*'
          ?
          介紹并括起記錄中的字段:
          ?
          ??? FIELDS給出記錄中字段的分隔符,FIELDS格式為:
          ?
          ??? FIELDS [TERMIALED [BY] {WHITESPACE | [X] 'charcter'} ]
          ??? [[OPTIONALLY] ENCLOSE [BY] [X]'charcter' ]
          ?
          ??? 01. TERMINATED:讀完前一個字段即開始讀下一個字段直到結束。
          ??? 02. WHITESPACE:是指結束符是空格的意思。包括空格、Tab、換行符、換頁符及回車符。如果是要判斷結束字符,可以用單引號括起,如X'1B'等。
          ??? 03. OPTIONALLY ENCLOSED:表示數據應由特殊字符括起來,也可以括在TERMINATED字符內,使用OPTIONALLY要同時用TERMINLATED。
          ??? 04. ENCLOSED:指兩個分界符內的數據。如果同時用 ENCLOSED和TERMINAED ,則它們的順序決定計算的順序。
          ?
          ??? [X]算法 select utl_raw.cast_to_raw('gdj3') from dual;
          ?
          定義列:
          ?
          ??? column是表列名,列的取值可以是:

          ??? 01. BECHUM 表示邏輯記錄數。第一個記錄為1,第2個記錄為2。
          ??? 02. CONSTANT 表示賦予常數。
          ??? 03. SEQUENCE 表示序列可以從任意序號開始,格式為:
          ????????? SEQUENCE ( { integer | MAX |COUNT} [,increment]
          ??? 04. POSITION 給出列在邏輯記錄中的位置。可以是絕對的,或相對前一列的值。格式為:
          ????????? POSITION ( {start[end] | * [+integer] } )
          ??? 05. Start 開始位置
          ????????? * 表示前字段之后立刻開始。
          ????????? + 從前列開始向后條的位置數。
          ?
          定義數據類型:
          ??? 可以定義14種數據類型:
          ??? CHAR:字符類型數據,length缺省為1
          ??????? 格式:CHAR[(length)] [delimiter]

          ??? DATE:日期類型數據,使用to_date函數來限制
          ??????? 格式:DATE [(length)]['date_format'] [delimiter]

          ??? DECIMAL EXTERNAL:字符格式中的十進制,用于常規格式的十進制數
          ??????? 格式:DECIMAL EXTERNAL [(length)] [delimiter]
          ??? DECIMAL:壓縮十進制格式數據
          ??????? 格式:DECIMAL (digtial [,divcision])

          ??? DOUBLE:雙精度符點二進制
          ??????? 格式:DOUBLE

          ??? FLOAT:普通浮點二進制
          ??????? 格式:FLOAT

          ??? FLOAT EXTERNAL:字符格式浮點數
          ??????? 格式:FLOAT EXTERNAL [(length)] [delimiter]
          ?
          ??? GRAPHIC:雙字節字符串數據
          ??????? 格式:GRAPHIC [(legth)]

          ??? GRAPHIC EXTERNAL:雙字節字符串數據
          ??????? 格式:GRAPHIC EXTERNAL[(legth)]

          ??? INTEGER:常規全字二進制整數

          ??? INTEGER EXTERNAL:字符格式整數

          ??? SMALLINT:常規全字二進制數據

          ??? VARCHAR:可變長度字符串

          ??? VARGRAPHIC:可變雙字節字符串數據
          ?
          ?
          4、 數據文件的內容
          ?
          ??? 數據文件可以是在OS下的一個文件;或跟在控制文件下的具體數據。數據文件可以是:
          ??? 01. 二進制與字符格式:SQL*Loader可以把二進制文件讀(當成字符讀)到列表中;
          ??? 02. 固定格式:記錄中的數據、數據類型、數據長度固定;
          ??? 03. 可變格式:每個記錄至少有一個可變長數據字段,一個記錄可以是一個連續的字符串;
          ??? 04. 數據段的分界(如姓名、年齡)如用','作字段的劃分;用'"'作數據括號等
          ??? 05. SQL*Loader可以使用多個連續字段的物理記錄組成一個邏輯記錄,記錄文件運行情況文件,包括以下內容:
          ??????? 1、運行日期、軟件版本號
          ??????? 2、全部輸入、輸出文件名;對命令行的展示信息、補充信息,
          ??????? 3、對每個裝入信息報告:如表名,裝入情況;對初始裝入、加截或更新裝入的選擇情況
          ??????? 4、數據錯誤報告:錯誤碼;放棄記錄報告
          ??????? 5、每個裝X報告:裝入行、裝入行數、可能跳過行數、可能拒絕行數、可能放棄行數等
          ??????? 6、統計概要:使用空間(包大小、長度)、讀入記錄數、裝入記錄數、跳過記錄數;拒絕記錄數、放棄記錄數;運行時間等。
          ?
          ?
          5、SQLLDR的命令:
          ?
          ??? 基本看最最上面的那個圖就OK了,隨便舉個例子:
          ??? D:\Test>sqlldr userid=wangxiaoqi/wangxiaoqi@dodo control=sqlldr.ctl
          ?
          ??? 需要注意的是:最好先轉到相應目錄下面在執行操作,另外可以對遠程數據庫進行操作!
          ?
          ??? 再具體一點的操作說明可以上該網站: http://www.psoug.org/reference/sqlloader.html
          ?
          ?
          ?
          ??? 總結:實在沒有太多的時間去仔細研究文檔,所以直接找了網上一篇記載得比較詳細的文章,粗略的看了一遍,修改了一下格式,文章錯誤的地方有很多,沒有看明白的地方也有很多,不過總得來說,SQL*Loader的實際應用還是相對比較簡單的,下一篇打算找一些實例加深一下了解,具體的參數可參見Oracle的官方文檔 《Utilities》
          ?
          ??? 說完!
          ?
          ?
          posted on 2008-12-25 21:57 decode360 閱讀(155) 評論(0)  編輯  收藏 所屬分類: 10.DB_Tools
          主站蜘蛛池模板: 六枝特区| 荆门市| 改则县| 永和县| 双桥区| 嵊泗县| 盱眙县| 临武县| 巴楚县| 长宁区| 盘锦市| 长泰县| 石屏县| 璧山县| 仁化县| 靖边县| 福泉市| 攀枝花市| 沐川县| 怀化市| 南通市| 上虞市| 台东县| 三台县| 通河县| 工布江达县| 金平| 炎陵县| 西贡区| 宿州市| 永胜县| 丰台区| 当涂县| 施甸县| 玉屏| 大连市| 陆丰市| 龙山县| 桑植县| 雅安市| 边坝县|