日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

DB2 Load 和 Oracle SQL*Loader

 dazheng 2009-02-24
Oracle SQL*Loader 使用一個(gè)控制文件裝載數(shù)據(jù),DB2 LOAD 實(shí)用程序也是這樣。但是,這些控制文件的結(jié)構(gòu)很不一樣,許多 Oracle 和 DB2 DBA 希望了解它們的差異。在本文中,要對(duì)比這兩個(gè)實(shí)用程序,討論如何使用 Perl 工具把 Oracle SQL*Loader 腳本轉(zhuǎn)換為 LOAD 腳本。因?yàn)樵诖笮蛿?shù)據(jù)倉(cāng)庫(kù)中空間總是很寶貴的,本文還解釋如何修改 DB2 LOAD 的數(shù)據(jù)文件。

DB2 LOAD 與 Oracle SQL*Loader 的對(duì)比

DB2 LOAD 與 DB2 IMPORT — 使用哪種 “路徑”?

注意:
DB2 IMPORT 實(shí)用程序并不像 Oracle IMPORT 實(shí)用程序那樣讀取一種專(zhuān)有格式,所以不應(yīng)該比較這兩個(gè)實(shí)用程序。

實(shí)際上,DB2 有兩種把外部數(shù)據(jù)源中的數(shù)據(jù)遷移到 DB2 表的實(shí)用程序:LOADIMPORT。LOAD 在頁(yè)面級(jí)存放數(shù)據(jù),這會(huì)繞過(guò)觸發(fā)器和日志記錄機(jī)制,并停止約束檢查和索引構(gòu)建,直到完成數(shù)據(jù)遷移。另一方面,IMPORT 基本上是執(zhí)行 INSERT,所以在把數(shù)據(jù)放到表中時(shí),會(huì)觸發(fā)觸發(fā)器、執(zhí)行日志記錄并執(zhí)行約束檢查和索引構(gòu)建。這兩個(gè)實(shí)用程序的選項(xiàng)之間還有其他許多差異,但是這超出了本文的范圍。

另一方面,Oracle SQL*Loader 實(shí)用程序有兩種操作模式,或者說(shuō)操作路徑:直接路徑和傳統(tǒng)路徑。Oracle DBA 在使用這種實(shí)用程序時(shí)要指定 “路徑”,這兩種路徑的效果分別與兩個(gè) DB2 實(shí)用程序相似。SQL*Loader “直接路徑” 模式的功能與 DB2 LOAD 相似。SQL*Loader “傳統(tǒng)路徑” 模式的功能與 DB2 IMPORT 相似。

注意:

對(duì) DB2 LOAD(以及 IMPORT)和 Oracle SQL*Loader 的每個(gè)特性(關(guān)鍵字及其選項(xiàng))進(jìn)行全面對(duì)比是不現(xiàn)實(shí)的。

因此,本文只討論 Oracle DBA 在把 SQL*Loader 腳本轉(zhuǎn)換為 DB2 LOAD 腳本時(shí)通常使用的主要特性。

作為 DB2 遷移專(zhuān)家,我們發(fā)現(xiàn)大多數(shù) Oracle DBA 在通常使用 SQL*Loader 的傳統(tǒng)模式,他們的經(jīng)驗(yàn)和腳本也是針對(duì)傳統(tǒng)路徑的。實(shí)際上,一些 Oracle DBA 從來(lái)沒(méi)有使用過(guò) SQL*Loader 的直接路徑模式。但是,當(dāng)他們開(kāi)始學(xué)習(xí) DB2 時(shí),常常選用 DB2 LOAD 實(shí)用程序(可能是因?yàn)檫@個(gè)名稱(chēng));因?yàn)?LOAD 具有 SQL*Loader 直接路徑模式的許多特征,而這些 Oracle DBA 沒(méi)有使用過(guò)直接路徑,所以他們會(huì)遇到許多困難。因此,為了把問(wèn)題談清楚,盡管大多數(shù) Oracle DBA 通常使用傳統(tǒng)模式,本文會(huì)演示如何把所有 SQL*Loader 腳本轉(zhuǎn)換為 DB2 LOAD 實(shí)用程序腳本,無(wú)論原來(lái)的腳本采用哪個(gè)路徑。我們認(rèn)為這樣做有助于 DB2 產(chǎn)生最佳性能。如果由于某種原因 DBA 希望把這些腳本轉(zhuǎn)換為使用 IMPORT 而不是 LOAD,以后也可以這么做(如果情況允許的話)。

SQL*Loader 命令行 — 調(diào)用 SQLLDR

用 SQLLDR 二進(jìn)制代碼調(diào)用 Oracle SQL*Loader 實(shí)用程序,使用的命令行語(yǔ)法與 DB2 LOAD 相似。命令行可以包含許多關(guān)鍵字,比如告訴 SQL*Loader 實(shí)用程序把消息發(fā)送到哪里、把丟棄的記錄發(fā)送到哪里等等。

SQLLDR 命令行還指定 “控制文件” 的名稱(chēng)(常常具有 .CTL 擴(kuò)展名)。這個(gè)控制文件也可以告訴 SQL*Loader 實(shí)用程序把消息發(fā)送到哪里、把丟棄的記錄發(fā)送到哪里等等。SQLLDR 命令行中的關(guān)鍵字設(shè)置優(yōu)先于控制文件中的設(shè)置,所以要想了解 SQL*Loader 會(huì)話的實(shí)際工作方式,必須同時(shí)關(guān)注 SQLLDR 命令行和控制文件。這樣的設(shè)計(jì)方式可能是為了提高 SQL*Loader 的靈活性和功能,但是在把腳本遷移到 DB2 時(shí),如果在這兩個(gè)位置都使用了一些相同的關(guān)鍵字,而且各個(gè)腳本的設(shè)置不一致,就可能引起混亂。

SQL*Loader 控制文件指定裝載操作的細(xì)節(jié),所以在對(duì)比 SQL*Loader 和 DB2 LOAD 時(shí),主要對(duì)比 SQLLDR 控制文件和 DB2 LOAD 命令行。但是,我們要先討論 SQLLDR 命令行的所有選項(xiàng),并將其與 DB2 LOAD 命令行進(jìn)行比較,看看它們的相似之處。然后,討論控制文件及其關(guān)鍵字和選項(xiàng),再與 DB2 LOAD 命令行進(jìn)行比較。


表 1. DB2 LOAD 與 Oracle SQL*Loader 直接路徑
特性 DB2 LOAD SQL*Loader(直接路徑)
直接路徑 使用 DB2 LOAD 實(shí)用程序 使用 SQL*Loader 直接路徑 —— 傳統(tǒng)路徑的許多選項(xiàng)不可用。
在裝載后生成統(tǒng)計(jì)數(shù)據(jù) 是(如果替換數(shù)據(jù)),不(如果追加數(shù)據(jù))
可恢復(fù) 可以,使用 COPY YES 選項(xiàng) 在直接路徑中不可以
默認(rèn)(值) 可用 不可用
使用多個(gè)輸入文件 可以 對(duì)于一個(gè) SQLLDR,只能使用一個(gè)文件
異常數(shù)據(jù) 寫(xiě)到一個(gè)異常表和/或 DUMP 文件 寫(xiě)到一個(gè)異常表
從游標(biāo)裝載
從管道裝載
BLOBS/CLOBS
XML 文檔
在裝載時(shí)允許壓縮
在線裝載 是 —— 可以訪問(wèn)表 在直接路徑中,不是在線裝載
在裝載時(shí)可以修改數(shù)據(jù)嗎? 可以 —— 通過(guò)用戶(hù)退出 可以 —— 傳統(tǒng)路徑(SQL 字符串)
不可以 —— 直接路徑
在列中填充常量值 不可以 可以,使用 CONSTANT 關(guān)鍵字
在多個(gè)數(shù)據(jù)庫(kù)分區(qū)中裝載 可以 無(wú)
如何調(diào)用? 它是一個(gè)可以從 SQL 腳本調(diào)用的 DB2 命令,也可以使用 API 通過(guò)應(yīng)用程序調(diào)用 它是一個(gè)可以從命令行調(diào)用的獨(dú)立實(shí)用程序,可以在應(yīng)用程序中通過(guò) API 調(diào)用
如何監(jiān)視裝載狀態(tài)? 從另一個(gè)連接運(yùn)行 LOAD QUERYLIST UTILITIES 命令 查看日志文件
并行性 經(jīng)過(guò)充分優(yōu)化,可以使用多個(gè) CPU、多個(gè)進(jìn)程和線程 可以通過(guò)使用多線程實(shí)現(xiàn)并行



清單 1. Oracle SQLLDR 命令行語(yǔ)法示例

            SQLLDR CONTROL=sample.ctl DATA=sample.dat LOG=sample.log BAD=sample.bad
            DISCARD=sample.dsc
            USERID=scott/tiger ERRORS=999 LOAD=2000 DISCARDMAX=5
            


表 2. Oracle SQLLDR 命令行關(guān)鍵字與 DB2 LOAD 關(guān)鍵字的比較
Oracle SQLLDR 關(guān)鍵字 Oracle SQLLDR 關(guān)鍵字說(shuō)明 DB2 LOAD 關(guān)鍵字 DB2 LOAD 關(guān)鍵字說(shuō)明
CONTROL=filename.ctl

包含詳細(xì)的 LOAD 命令選項(xiàng)的文件。

無(wú)

不從控制文件單獨(dú)調(diào)用 DB2 LOAD 命令選項(xiàng)。DB2 LOAD 命令在一個(gè)調(diào)用中包含所有關(guān)鍵字。

DIRECT=true

調(diào)用 Oracle SQL*Loader 實(shí)用程序的直接路徑模式。

LOAD

DB2 LOAD 實(shí)用程序本身非常接近 Oracle SQL*Loader 實(shí)用程序的直接路徑模式。

DIRECT=false

如果不使用這個(gè)關(guān)鍵字或值為 “false”,就調(diào)用 Oracle SQL*Loader 實(shí)用程序的傳統(tǒng)路徑模式。

IMPORT

DB2 IMPORT 實(shí)用程序本身非常接近 Oracle SQL*Loader 實(shí)用程序的傳統(tǒng)路徑模式。

BAD=filename.bad

存儲(chǔ)被拒絕的記錄的地方。

MODIFIED BY DUMPFILE=filename

這個(gè) DB2 LOAD 修飾符用來(lái)決定在哪里存儲(chǔ)被拒絕的記錄。

DATA=filename.dat

輸入數(shù)據(jù)源文件。

FROM sourcename

DB2 LOAD 的 sourcename 可以是文件、管道、設(shè)備或游標(biāo)。

DISCARD=filename.dsc

由于各種原因未裝載的異常記錄。

FOR EXCEPTION tablename

DB2 LOAD 把違反惟一索引規(guī)則的記錄(異常)放到以前創(chuàng)建的一個(gè)表中。

DISCARDMAX=number

定義在 SQLLDR 終止之前允許的最大丟棄記錄數(shù)。

WARNINGCOUNT=number

在達(dá)到這個(gè)警告數(shù)時(shí),DB2 LOAD 終止。丟棄僅僅是警告類(lèi)型之一。

ERRORS=number

定義在 SQLLDR 終止之前允許的最大錯(cuò)誤數(shù)。

NOROWWARNINGS

修飾符 NOROWWARNINGS 可以關(guān)閉行警告,但是仍然保留異常記錄的警告。

LOAD=number

要裝載的記錄數(shù)(ALL 是默認(rèn)設(shè)置)。

ROWCOUNT number

指定要裝載的記錄數(shù)。如果省略這個(gè)關(guān)鍵字,默認(rèn)設(shè)置是所有記錄。

MULTITHREADING=true

允許在客戶(hù)端進(jìn)行流構(gòu)建,在服務(wù)器端進(jìn)行流裝載。

CPU_PARALLELISM number


DISK_PARALLELISM number


FETCH_PARALLELISM yes

DB2 LOAD 自動(dòng)決定這些設(shè)置,用來(lái)控制為對(duì)文件、設(shè)備、管道和游標(biāo)裝載中的記錄進(jìn)行解析、轉(zhuǎn)換、格式化和寫(xiě)操作所生成的線程數(shù)。也可以使用這些關(guān)鍵字指定自己需要的值。

ROWS=number

每次數(shù)據(jù)保存存儲(chǔ)的行數(shù)。

SAVECOUNT number

DB2 LOAD 使用一致點(diǎn)確保裝載操作的可恢復(fù)性。

LOG=logfile

LOG 存儲(chǔ)裝載操作的輸出。

MESSAGES messagefile

DB2 把消息放到這個(gè)消息文件中。如果不指定消息文件,它就不產(chǎn)生消息。

SILENT=options

SILENT=options 可以關(guān)閉操作不同部分的消息輸出。

NOROWWARNINGS

修飾符 NOROWWARNINGS 關(guān)閉操作不同部分的消息輸出。

SKIP=number

在 n 個(gè)記錄之后開(kāi)始裝載。通常,如果裝載操作提交了部分裝載,但是操作沒(méi)有完成,就使用這個(gè)關(guān)鍵字重新啟動(dòng)這個(gè)操作。
注意:如果使用這個(gè)特性,SQL*Loader 要求操作者自己決定裝載啟始點(diǎn),選擇錯(cuò)誤的數(shù)值會(huì)導(dǎo)致丟失數(shù)據(jù)或數(shù)據(jù)重復(fù)。

RESTART
(REPLACE, INSERT, TERMINATE)

DB2 LOAD 使用這個(gè)模式在遇到故障之前的最后一個(gè)一致點(diǎn)之后選擇重新裝載的啟始點(diǎn)。DB2 LOAD 會(huì)自己決定啟始點(diǎn),不需要操作者計(jì)算。
DB2 LOAD 可以使用的其他模式有 REPLACE、INSERT 和 TERMINATE,但是這些模式與 SKIP 關(guān)鍵字無(wú)關(guān)。

SKIP_INDEX_MAINTENANCE=true

停止索引維護(hù)并把索引標(biāo)為不可用。

INDEXING MODE DEFERRED

DB2 LOAD 可以把索引刷新推遲到以后訪問(wèn)數(shù)據(jù)或數(shù)據(jù)庫(kù)激活期間。

SKIP_UNUSABLE_INDEX=true

跳過(guò)已經(jīng)標(biāo)為不可用的所有索引的索引維護(hù)。

INDEXING MODE REBUILD, INCREMENTAL, AUTOSELECT

DB2 LOAD 還可以指定 INDEXING MODE REBUILD、INCREMENTAL 或 AUTOSELECT,這決定 LOAD 如何執(zhí)行索引維護(hù)。

READSIZE=number

在必須提交之前讀取的外部數(shù)據(jù)文件大小。

DATA BUFFER number

DB2 LOAD 使用許多大小為 4K 的頁(yè)面?zhèn)鬏敂?shù)據(jù),這個(gè)數(shù)值通常是自動(dòng)決定的,但是也可以用這個(gè)關(guān)鍵字指定自己需要的值。

USERID/PASSWORD

連接數(shù)據(jù)庫(kù)所用的用戶(hù) id。

CONNECT TO... number

DB2 在后續(xù)的所有 LOAD 命令前面使用一個(gè)連接命令。




SQL*Loader 控制文件 —— SQL*Loader 實(shí)用程序的核心

盡管 Oracle SQL*Loader 命令行允許通過(guò)許多關(guān)鍵字控制這個(gè)實(shí)用程序的工作方式,但是我們習(xí)慣于通過(guò)控制文件而不是命令行來(lái)指定大多數(shù)關(guān)鍵字。我們來(lái)研究一個(gè)典型的 SQL*Loader 控制文件以及轉(zhuǎn)換產(chǎn)生的 DB2 LOAD 命令腳本。


表 3. 典型的 Oracle SQL*Loader 控制文件以及轉(zhuǎn)換產(chǎn)生的 DB2 LOAD 腳本
DB2 LOAD 命令文件示例(INSERT 固定數(shù)據(jù)) Oracle SQL*Loader 控制文件示例(INSERT 固定數(shù)據(jù))
							(1)  LOAD
                        (2)  FROM 'INPUT_FILE1.DAT'
                        (3)  OF ASC
                        (4)  MODIFIED BY DUMPFILE='INPUT_FILE1.BAD'
                        (5)  METHOD L (1 5, 6 15, 16 20)
                        (6)  INSERT INTO PROD.TB_TABLE1
                        (7)  (COL1,
                        COL2,
                        COL3 )
                        (8)  FOR EXCEPTION PROD.TB_TABLE1_DSC
                        ;
                        

							(1)  LOAD DATA
                        (2)  INFILE 'INPUT_FILE1.DAT'
                        (4)  BADFILE 'INPUT_FILE1.BAD'
                        (8)  DISCARDFILE 'INPUT_FILE1.DSC'
                        (6)  APPEND INTO TABLE PROD.TB_TABLE1
                        (5)(7)(COL1 POSITION(01:05),
                        COL2 POSITION(06:15),
                        COL3 POSITION(16:20) )
                        ;
                        




DB2 LOAD 命令文件示例(REPLACE 可變數(shù)據(jù)) Oracle SQL*Loader 控制文件示例(REPLACE 可變數(shù)據(jù))
							(1)  LOAD
                        (2)  FROM 'INPUT_FILE2.DAT'
                        (3)  OF DEL
                        (4)  MODIFIED BY DUMPFILE='INPUT_FILE2.BAD'
                        (3)  COLDEL|
                        (3)  CHARDEL"
                        (5)  METHOD P (1, 2, 3)
                        (6)  REPLACE INTO PROD.TB_TABLE2
                        (7)  (COL1,
                        COL2,
                        COL3 )
                        (8)  FOR EXCEPTION PROD.TB_TABLE2_DSC
                        ;
                        

							(1)  LOAD DATA
                        (2)  INFILE 'INPUT_FILE2.DAT'
                        (4)  BADFILE 'INPUT_FILE2.BAD'
                        (8)  DISCARDFILE 'INPUT_FILE2.DSC'
                        (6)  REPLACE INTO TABLE PROD.TB_TABLE2
                        (3)  FIELDS TERMINATED BY '|'
                        (3)  OPTIONALLY ENCLOSED BY '"'
                        (5)(7)(COL1,
                        COL2,
                        COL3 )
                        ;
                        



下面對(duì)比以上示例:

  • (1) LOAD

    這會(huì)在 DB2 中調(diào)用 LOAD 實(shí)用程序,還可以用 IMPORT 調(diào)用這個(gè)實(shí)用程序。

    在 Oracle 中,使用 LOAD DATA 調(diào)用 SQL*Loader 實(shí)用程序。要想指定直接路徑裝載,必須指定 DIRECT=true。默認(rèn)設(shè)置是 DIRECT=false,因此沒(méi)有在這個(gè)示例中給出。

  • (2) FROM [inputfile_name]

    這是包含要裝載的數(shù)據(jù)的文件。DB2 LOAD 還可以從管道、設(shè)備或游標(biāo)裝載數(shù)據(jù)。

    Oracle 也指定輸入文件或管道,還可以通過(guò)控制文件用 BEGIN …END 子句指定內(nèi)聯(lián)數(shù)據(jù)。

  • (3) OF ASC / DEL

    對(duì)于 DB2 LOAD,ASC 表示不分界的 ASCII 數(shù)據(jù),數(shù)據(jù)的劃分由位置決定。DEL 表示分界的 ASCII 數(shù)據(jù),每行的數(shù)據(jù)長(zhǎng)度可變。分界的數(shù)據(jù)可以使用多種修飾符,主要的兩種是 COLDEL 和 CHARDEL;COLDEL 決定列和列之間如何分界,默認(rèn)設(shè)置是逗號(hào);CHARDEL 決定字符串?dāng)?shù)據(jù)如何分界,默認(rèn)設(shè)置是雙引號(hào)。

    Oracle 有 FIX(默認(rèn)設(shè)置,因此在這個(gè)示例中沒(méi)有給出)或 VAR 關(guān)鍵字,但是很少使用。通常使用其他關(guān)鍵字和插入列引用,插入列引用決定數(shù)據(jù)是固定的還是可變的。例如,關(guān)鍵字 FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 的作用與 DB2 LOAD 中的 COLDEL 和 CHARDEL 相似,這表示可變的分界數(shù)據(jù)。

  • (4) MODIFIED BY DUMPFILE=[dumpfile_name]

    DB2 把被拒絕的記錄放到這個(gè)文件中。

    Oracle 使用 BADFILE 關(guān)鍵字完成同樣的工作。

  • (5) METHOD P (1,2,3)

    DB2 LOAD 有三個(gè)方法:

    1. METHOD L 只用于 ASC 數(shù)據(jù),這個(gè)方法要指出每列的開(kāi)頭和結(jié)尾。它的形式是:METHOD L (start1 end1, start2 end2….)
    2. METHOD N 用于 IXF 或游標(biāo)數(shù)據(jù),它要指定源表中要裝載的列。它的形式是:METHOD N (col1, col2, col4…)
    3. METHOD P 用于 DEL、IXF 或游標(biāo)數(shù)據(jù),它要指定源數(shù)據(jù)中要裝載的列的位置號(hào)。它的形式是:METHOD P (1, 2, 4…)

    如這個(gè)示例所示,SQL*Loader 可以在同一行上組合使用列名和字段位置。

  • (6) INSERT / REPLACE INTO PROD.TABLE

    DB2 LOAD 在這里有四個(gè)選項(xiàng)。與 Oracle SQL*Loader 對(duì)應(yīng)的兩個(gè)選項(xiàng)是 INSERT 和 REPLACE。另外兩個(gè) DB2 LOAD 選項(xiàng)是 RESTART 和 TERMINATE。當(dāng) DB2 LOAD 由于任何原因未完成時(shí),使用這些選項(xiàng)。

    SQL*Loader 也有 INSERT,但是這只用于空表;而且 APPEND 對(duì)空表的作用與 INSERT 相似,所以 Oracle DBA 很少使用 INSERT。SQL*Loader REPLACE 的作用與 DB2 LOAD REPLACE 相同。

  • (7) (COL1, COL2, COL3) Insert Column List

    DB2 LOAD 使用這個(gè)列表決定要放入數(shù)據(jù)的列。如果省略這個(gè)列列表,那么 DB2 LOAD 會(huì)嘗試按照讀取和解析數(shù)據(jù)的次序裝載數(shù)據(jù)。

    如這個(gè)示例所示,SQL*Loader 可以在同一行上組合使用列名和字段位置。對(duì)于長(zhǎng)度可變的數(shù)據(jù),不給出位置,而是由分界符決定字段的劃分。

  • (8) FOR EXCEPTION [table_name]

    DB2 LOAD 把違反惟一索引規(guī)則的記錄(異常)放到以前創(chuàng)建的這個(gè)表中。

    SQL*Loader 使用 DISCARDFILE 完成同樣的工作,但使用的是一個(gè)操作系統(tǒng)文件而不是 DB2 表。


表 4. Oracle SQLLDR 控制文件關(guān)鍵字與 DB2 LOAD 關(guān)鍵字的比較
Oracle SQLLDR 關(guān)鍵字 Oracle SQLLDR 關(guān)鍵字說(shuō)明 DB2 LOAD 關(guān)鍵字 DB2 LOAD 關(guān)鍵字說(shuō)明

DIRECT=true

調(diào)用 Oracle SQL*Loader 實(shí)用程序的直接路徑模式。

LOAD

DB2 LOAD 實(shí)用程序本身非常接近 Oracle SQL*Loader 實(shí)用程序的直接路徑模式。

DIRECT=false

如果不使用這個(gè)關(guān)鍵字或值為 “false”,就調(diào)用 Oracle SQL*Loader 實(shí)用程序的傳統(tǒng)路徑模式。

IMPORT

DB2 IMPORT 實(shí)用程序本身非常接近 Oracle SQL*Loader 實(shí)用程序的傳統(tǒng)路徑模式。

ERRORS=number

定義在 SQLLDR 終止之前允許的最大錯(cuò)誤數(shù)。

NOROWWARNINGS

修飾符 NOROWWARNINGS 可以關(guān)閉行警告,但是仍然保留異常記錄的警告。

LOAD=number

要裝載的記錄數(shù)(ALL 是默認(rèn)設(shè)置)。

ROWCOUNT number

指定要裝載的記錄數(shù)。如果省略這個(gè)關(guān)鍵字,默認(rèn)設(shè)置是所有記錄。

MULTITHREADING=true

允許在客戶(hù)端進(jìn)行流構(gòu)建,在服務(wù)器端進(jìn)行流裝載。

CPU_PARALLELISM number


DISK_PARALLELISM number


FETCH_PARALLELISM yes

DB2 LOAD 自動(dòng)決定這些設(shè)置,用來(lái)控制為對(duì)文件、設(shè)備、管道和游標(biāo)裝載中的記錄進(jìn)行解析、轉(zhuǎn)換、格式化和寫(xiě)操作所生成的線程數(shù)。也可以使用這些關(guān)鍵字指定自己需要的值。

READSIZE=n

在必須提交之前讀取的外部數(shù)據(jù)文件大小。

DATA BUFFER number

DB2 LOAD 使用許多大小為 4K 的頁(yè)面?zhèn)鬏敂?shù)據(jù),這個(gè)數(shù)值通常是自動(dòng)決定的,但是也可以用這個(gè)關(guān)鍵字指定自己需要的值。

ROWS=number

每次數(shù)據(jù)保存存儲(chǔ)的行數(shù)。

SAVECOUNT number

DB2 LOAD 使用一致點(diǎn)確保裝載操作的可恢復(fù)性。

SILENT=options

SILENT=options 可以關(guān)閉操作不同部分的消息輸出。

NOROWWARNINGS

修飾符 NOROWWARNINGS 關(guān)閉裝載操作不同部分的消息輸出。

SKIP=number

在 n 個(gè)記錄之后開(kāi)始裝載。通常,如果裝載操作提交了部分裝載,但是操作沒(méi)有完成,就使用這個(gè)關(guān)鍵字重新啟動(dòng)這個(gè)操作。
注意:如果使用這個(gè)特性,SQL*Loader 要求操作者自己決定裝載啟始點(diǎn),選擇錯(cuò)誤的數(shù)值會(huì)導(dǎo)致丟失數(shù)據(jù)或數(shù)據(jù)重復(fù)。

RESTART
(REPLACE, INSERT, TERMINATE)

DB2 LOAD 使用這個(gè)模式在遇到故障之前的最后一個(gè)一致點(diǎn)之后選擇重新裝載的啟始點(diǎn)。DB2 LOAD 會(huì)自己決定啟始點(diǎn),不需要操作者計(jì)算。
DB2 LOAD 可以使用的其他模式有 REPLACE、INSERT 和 TERMINATE,但是這些模式與 SKIP 關(guān)鍵字無(wú)關(guān)。

SKIP_INDEX_MAINTENANCE=true

停止索引維護(hù)并把索引標(biāo)為不可用。

INDEXING MODE DEFERRED

DB2 LOAD 可以把索引刷新推遲到以后訪問(wèn)數(shù)據(jù)或數(shù)據(jù)庫(kù)激活期間。

SKIP_UNUSABLE_INDEX=true

跳過(guò)已經(jīng)標(biāo)為不可用的所有索引的索引維護(hù)。

INDEXING MODE REBUILD, INCREMENTAL, AUTOSELECT

DB2 LOAD 還可以指定 INDEXING MODE REBUILD、INCREMENTAL 或 AUTOSELECT,這決定 LOAD 如何執(zhí)行索引維護(hù)。

NOLOGGING

這個(gè)選項(xiàng)允許繞過(guò)日志記錄機(jī)制,但是會(huì)使這個(gè)表無(wú)法通過(guò)前滾操作恢復(fù)。

NONRECOVERABLE

如果使用這個(gè)選項(xiàng),在裝載操作之后表空間并不處于備份未完成狀態(tài),在裝載操作期間不必復(fù)制裝載的數(shù)據(jù)。

CONTINUE_LOAD DATA

重新啟動(dòng)終止的裝載操作,自動(dòng)尋找正確的啟始點(diǎn)(只適用于直接路徑模式)。

RESTART

DB2 LOAD 使用遇到故障之前的最后一個(gè)一致點(diǎn)選擇重新裝載的啟始點(diǎn)。

LOAD DATA

調(diào)用 SQLLDR 二進(jìn)制代碼,以任何模式(即路徑)裝載數(shù)據(jù)。

1. LOAD
2. IMPORT

DB2 LOAD 實(shí)用程序本身非常接近 Oracle SQL*Loader 實(shí)用程序的直接路徑模式。
DB2 IMPORT 實(shí)用程序本身非常接近 Oracle SQL*Loader 實(shí)用程序的傳統(tǒng)路徑模式。

INFILE filename

輸入數(shù)據(jù)源文件。

FROM sourcename

DB2 LOAD 的 sourcename 可以是文件、管道、設(shè)備或游標(biāo)。

RECSIZE n

固定的輸入記錄的大小。

MODIFIED BY RECLEN=x

固定的輸入記錄的大小。

BADFILE filename

存儲(chǔ)被拒絕記錄的地方。

MODIFIED BY DUMPFILE=filename

這個(gè) DB2 LOAD 修飾符用來(lái)決定在哪里存儲(chǔ)被拒絕的記錄。

DISCARDFILE filename

由于各種原因未裝載的異常記錄。

FOR EXCEPTION tablename

DB2 LOAD 把違反惟一索引規(guī)則的記錄(異常)放到以前創(chuàng)建的一個(gè)表中。

DISCARD

由于各種原因未裝載的異常記錄。

FOR EXCEPTION filename

DB2 LOAD 把違反惟一索引規(guī)則的記錄(異常)放到以前創(chuàng)建的一個(gè)表中。

DISCARDMAX

定義在 SQLLDR 終止之前允許的最大丟棄記錄數(shù)。

1. WARNINGCOUNT=number
2. NOROWWARNINGS

在達(dá)到這個(gè)警告數(shù)時(shí),DB2 LOAD 終止。丟棄僅僅是警告類(lèi)型之一。
修飾符 NOROWWARNINGS 可以關(guān)閉行警告,但是仍然保留異常記錄的警告。

1. VAR n
2. FIX n

分別指定數(shù)據(jù)長(zhǎng)度是可變的還是固定的。如果使用 VAR,那么 n 是位于行首用來(lái)聲明每行長(zhǎng)度的數(shù)據(jù)的字節(jié)數(shù)。

1. OF DEL
2. OF ASC

DB2 可變數(shù)據(jù)是分界的,固定數(shù)據(jù)是 ASCII。

1. INSERT 或 APPEND
2. REPLACE

INSERT 和 APPEND 的相似之處是它們都在已經(jīng)存在的數(shù)據(jù)中添加數(shù)據(jù),但是 INSERT 要求表是空的。
REPLACE 會(huì)在添加新數(shù)據(jù)之前清除表中的現(xiàn)有數(shù)據(jù)。

1. INSERT
2. REPLACE

DB2 LOAD INSERT 向表中添加數(shù)據(jù),即使表是空的。
REPLACE 會(huì)在添加新數(shù)據(jù)之前清除表中的現(xiàn)有數(shù)據(jù)。

INTO TABLE tablename

要存儲(chǔ)數(shù)據(jù)的目標(biāo)表。

INTO TABLE tablename

要存儲(chǔ)數(shù)據(jù)的目標(biāo)表。

TERMINATED BY string

發(fā)現(xiàn)這個(gè)字符串時(shí)結(jié)束數(shù)據(jù)讀取。

MODIFIED BY COLDELx

在所有輸入數(shù)據(jù)中以這個(gè)字符分隔各個(gè)列(默認(rèn)設(shè)置是逗號(hào))。

ENCLOSED BY string

可以用這個(gè)字符串包圍數(shù)據(jù);通常用于字符數(shù)據(jù)。

MODIFIED BY CHARDELx

用這個(gè)字符包圍輸入的字符數(shù)據(jù)(默認(rèn)設(shè)置是雙引號(hào))。

LOBFILE (filename)

在 INSERT 列列表中指定這個(gè)關(guān)鍵字,用來(lái)從外部文件源裝載 LOB。
參數(shù)本身應(yīng)該包含文件名和完整的路徑名,否則會(huì)在 LOAD 腳本所在的目錄中搜索 LOB。

1. LOBS FROM pathnames
2. MODIFIED BY LOBSINFILE

尋找 LOB 文件的路徑。
要想使用 LOBS FROM 子句,就必須設(shè)置這個(gè)關(guān)鍵字。
參數(shù)本身包含文件名,但是不包含完整的路徑名,因?yàn)閷⑺阉?LOBS FROM 路徑。







回頁(yè)首


DB2 LOAD 命令

現(xiàn)在看看 DB2 LOAD 命令的語(yǔ)法。





回頁(yè)首


將 SQL*Loader 轉(zhuǎn)換為 DB2 LOAD 的 Perl 腳本

這里給出的 Perl 腳本用來(lái)把 SQL*Loader 控制文件轉(zhuǎn)換為等效的 DB2 LOAD 腳本??梢砸詡鹘y(tǒng)和直接路徑模式調(diào)用 SQL*Loader,但是 SQL*Loader 在直接路徑模式中不使用 SQL 字符串控制數(shù)據(jù)格式。Oracle DBA 有時(shí)候會(huì)忽視這些選項(xiàng)并交換使用傳統(tǒng)和直接路徑模式,而沒(méi)有認(rèn)識(shí)到產(chǎn)生的副作用。SQL*Loader 傳統(tǒng)路徑基本上相當(dāng)于 DB2 IMPORT 實(shí)用程序,IMPORT 使用引擎在 DB2 中執(zhí)行批量插入。通過(guò)使用數(shù)據(jù)庫(kù)引擎,可以利用觸發(fā)器等特性,這在 SQL*Loader 直接路徑模式或 DB2 LOAD 實(shí)用程序中是不可行的。這個(gè) Perl 腳本把 SQL*Loader 控制文件的直接和傳統(tǒng)路徑版本都轉(zhuǎn)換為 DB2 LOAD 腳本。如果希望使用與 SQL*Loader 傳統(tǒng)路徑等效的 DB2 IMPORT 腳本,應(yīng)該把生成的文件中的 LOAD 關(guān)鍵字改為 IMPORT。

運(yùn)行 Perl 腳本的前提條件

要想把 SQL*Loader 腳本轉(zhuǎn)換為 DB2 LOAD 腳本 ,需要在目標(biāo)平臺(tái)上安裝 Perl。本文假設(shè)您熟悉如何在目標(biāo)平臺(tái)上安裝 Perl 工具。這里給出的示例適用于 Windows 平臺(tái),但是可以在您選擇的任何平臺(tái)上使用這個(gè)工具。

如何運(yùn)行 Perl 腳本

如果在運(yùn)行這個(gè)工具時(shí)沒(méi)有指定任何參數(shù),它就會(huì)顯示使用方法,見(jiàn)清單 3:


清單 3. 工具的使用方法
            C:\>perl ora2db2.pl
            USAGE: perl ora2db.pl -c controlfile [options]
            -o ostype (Unix|Windows - default is Unix. Other value is Windows
            -m message_directory_name (default is MSG_DIR)
            -e dump_directory_name (default is DUMP_DIR).
            This dir should reside on all partitions on DB2 server.
            -d data_file_name (default is INPUT_FILE)
            -f defaultif clause set to either (default|null - default is null)
            -s schema name. Replace with the schema name in control file
            -g timestamp format. Default is YYYY-MM-DD
            

可以指定一些參數(shù)作為 SQLLDR 命令的參數(shù),它們優(yōu)先于控制文件中定義的選項(xiàng)。如果使用一個(gè)腳本帶參數(shù)調(diào)用 SQLLDR,這可能會(huì)導(dǎo)致遷移問(wèn)題。這些參數(shù)可以與運(yùn)行工具時(shí)給出的開(kāi)關(guān)匹配,讓創(chuàng)建的 DB2 LOAD 腳本使用正確的參數(shù)。

下面的示例演示如何轉(zhuǎn)換具有不同格式選項(xiàng)的直接和傳統(tǒng)路徑控制文件。

C:\>perl ora2db2.pl -c test1.ctl -d data\test1.data -m msg -e dump -o Windows
            -s ADMIN -f null > load1.db2
            C:\>perl ora2db2.pl -c test2.ctl -d data\test2.data -m msg -e dump -o Windows
            -s ADMIN -f null > load2.db2
            

如何運(yùn)行 Perl 和修改這個(gè)腳本:
  • 把 SQL*Loader 腳本轉(zhuǎn)換為 DB2 LOAD 腳本不需要了解 Perl。
  • 但是,有時(shí)候可能需要根據(jù)自己的需求修改這個(gè)工具。
  • 有時(shí)候,如果 SQL*Loader 腳本太復(fù)雜,這個(gè)工具可能無(wú)法解析腳本。
  • 如果您熟悉 Perl 腳本,可以按照以下說(shuō)明對(duì)給出的 Perl 腳本做簡(jiǎn)單修改。
    1. 在 Windows 或開(kāi)發(fā)機(jī)器上安裝 Perl 工具。
    2. 安裝 Eclipse 并安裝 Perl 插件。
    3. 創(chuàng)建一個(gè) Perl 項(xiàng)目并把 ora2db.pl 和 userexit.pl 文件復(fù)制到這個(gè)目錄中。
    4. 可以以調(diào)試模式使用 Perl,根據(jù)自己的需要逐步修改/增強(qiáng)代碼。
  • 希望您把所做的修改告訴我們,以便幫助其他工具用戶(hù)。
  • 這個(gè)工具尚未經(jīng)過(guò)授權(quán)。請(qǐng)閱讀許可協(xié)議。




清單 4. 使用直接路徑和位置列的 SQL*Loader test1.ctl
            UNRECOVERABLE
            LOAD DATA
            INFILE 'INPUT_FILE'
            APPEND
            INTO TABLE JOHN.TABLE1
            TRAILING NULLCOLS
            (
            BC_OFF_BCBANK POSITION(2:4) CHAR   ,
            BC_OFF_SEGMENT_TYPE POSITION(5:12) CHAR "rtrim(:BC_OFF_SEGMENT_TYPE,' ')"    ,
            BC_OFF_NUM POSITION(13:18) CHAR DEFAULTIF BC_OFF_NUM= ' ?????',
            BC_OFF_SQ_EFF_DATE POSITION(19:26) CHAR DEFAULTIF BC_OFF_SQ_EFF_DATE=" ???????",
            BC_OFF_SQ_ENT_DATE POSITION(27:40) CHAR DEFAULTIF BC_OFF_SQ_ENT_DATE = ' ?????????????',
            BC_OFF_DELETE POSITION(41:41) CHAR,
            BC_OFF_EFF_DATE POSITION(42:53) CHAR DEFAULTIF BC_OFF_EFF_DATE =' ???????????',
            BC_OFF_INITIALS POSITION(54:56) CHAR "rtrim(:BC_OFF_INITIALS,' ')",
            BC_OFF_NAME POSITION(57:76) CHAR "rtrim(:BC_OFF_NAME,' ')",
            BC_OFF_C_L_SECTION POSITION(77:78) CHAR,
            BC_OFF_PHONE_NR POSITION(79:90) CHAR DEFAULTIF BC_OFF_PHONE_NR=' ???????????',
            BC_OFF_SC_LND_LMT POSITION(91:98) CHAR DEFAULTIF BC_OFF_SC_LND_LMT = ' ???????',
            BC_OFF_UNSC_LND_LMT POSITION(99:106) CHAR DEFAULTIF BC_OFF_UNSC_LND_LMT = ' ???????',
            BC_OFF_NEWCOL POSITION(107:107) CHAR NULLIF (BC_OFF_NEWCOL=BLANKS),
            PRCS_DTE CONSTANT "PROCESSDATE",
            PRCS_YR_MTH_NBR CONSTANT "PROCYRMTH"
            )
            


清單 5. 使用方法 L 轉(zhuǎn)換產(chǎn)生的 DB2 LOAD 腳本
            -- Converting Oracle SQL*Loader Control File test1.ctl to DB2
            -- ALTER Statements to take care of CONSTANT parameters
            ALTER TABLE TABLE2 ALTER COLUMN PRCS_DTE SET WITH DEFAULT 'PROCESSDATE';
            ALTER TABLE TABLE2 ALTER COLUMN PRCS_YR_MTH_NBR SET WITH DEFAULT 'PROCYRMTH';
            -- DB2 LOAD Script
            LOAD FROM "data\test1.data"
            OF ASC
            MODIFIED BY ANYORDER USEDEFAULTS STRIPTBLANKS TIMESTAMPFORMAT="YYYY-MM-DD"
            DUMPFILE="dump\admin_table1.dump"
            METHOD L
            (
            2 4
            ,5 12
            ,13 18
            ,19 26
            ,27 40
            ,41 41
            ,42 53
            ,54 56
            ,57 76
            ,77 78
            ,79 90
            ,91 98
            ,99 106
            ,107 107
            )
            MESSAGES "msg\admin_table1.msg"
            INSERT INTO "ADMIN"."TABLE1"
            ( BC_OFF_BCBANK
            ,BC_OFF_SEGMENT_TYPE
            ,BC_OFF_NUM
            ,BC_OFF_SQ_EFF_DATE
            ,BC_OFF_SQ_ENT_DATE
            ,BC_OFF_DELETE
            ,BC_OFF_EFF_DATE
            ,BC_OFF_INITIALS
            ,BC_OFF_NAME
            ,BC_OFF_C_L_SECTION
            ,BC_OFF_PHONE_NR
            ,BC_OFF_SC_LND_LMT
            ,BC_OFF_UNSC_LND_LMT
            ,BC_OFF_NEWCOL
            )
            NONRECOVERABLE
            INDEXING MODE AUTOSELECT
            ;
            -- UPDATE Statements for setting proper DEFAULTIF parameters
            UPDATE "ADMIN"."TABLE1"
            SET BC_OFF_NUM = NULL
            WHERE  BC_OFF_NUM = ' ?????';
            UPDATE "ADMIN"."TABLE1"
            SET BC_OFF_SQ_EFF_DATE = NULL
            WHERE  BC_OFF_SQ_EFF_DATE = ' ???????';
            UPDATE "ADMIN"."TABLE1"
            SET BC_OFF_SQ_ENT_DATE = NULL
            WHERE  BC_OFF_SQ_ENT_DATE = ' ?????????????';
            UPDATE "ADMIN"."TABLE1"
            SET BC_OFF_EFF_DATE = NULL
            WHERE  BC_OFF_EFF_DATE = ' ???????????';
            UPDATE "ADMIN"."TABLE1"
            SET BC_OFF_PHONE_NR = NULL
            WHERE  BC_OFF_PHONE_NR = ' ???????????';
            UPDATE "ADMIN"."TABLE1"
            SET BC_OFF_SC_LND_LMT = NULL
            WHERE  BC_OFF_SC_LND_LMT = ' ???????';
            UPDATE "ADMIN"."TABLE1"
            SET BC_OFF_UNSC_LND_LMT = NULL
            WHERE  BC_OFF_UNSC_LND_LMT = ' ???????';
            -- UPDATE Statements for setting proper NULLIF parameters
            UPDATE "ADMIN"."TABLE1"
            SET BC_OFF_NEWCOL = NULL
            WHERE  BC_OFF_NEWCOL = 'BLANKS)';
            


清單 6. 使用傳統(tǒng)路徑和分界列的 SQL*Loader test2.ctl
            LOAD DATA
            INFILE 'INPUT_FILE'
            APPEND
            INTO TABLE JOHN.TABLE2
            FIELDS TERMINATED BY '	'
            TRAILING NULLCOLS
            (
            CR_BUR_PTFLO_TYP_DESC char(255) NULLIF CR_BUR_PTFLO_TYP_DESC=BLANKS,
            DW_PROD_SERV_FEE_PLN_RCD_ID,
            DW_ULT_PROD_SERV_ID,
            ACCT_NBR,
            ACCT_GRP_NBR,
            APPL_CDE,
            PRCS_GRP_NBR,
            FEE_CAT_CDE,
            FEE_PLN_NBR,
            FEE_DESC,
            FEE_TYP_CDE,
            FEE_EARN_CDE,
            CMPT_1_NXT_ASSMT_DTE     DATE "YYYY-MM-DD",
            CMPT_2_NXT_ASSMT_DTE     DATE "YYYY-MM-DD",
            CMPT_3_NXT_ASSMT_DTE     DATE "YYYY-MM-DD",
            CUR_PMT_DUE_DTE          DATE "YYYY-MM-DD",
            EARN_GOOD_THRU_1_DTE     DATE "YYYY-MM-DD",
            EARN_GOOD_THRU_2_DTE     DATE "YYYY-MM-DD",
            PR_PMT_DUE_DTE           DATE "YYYY-MM-DD",
            NXT_PMT_DUE_DTE          DATE "YYYY-MM-DD",
            DW_ASP_ID,
            CLNT_ID,
            CUR_REC_IND,
            SOR_EXP_DTE             "NVL(:SOR_EXP_DTE,'4444-12-31')",
            EFF_DTE                 DATE "YYYY-MM-DD"
            )
            


清單 7. 使用方法 P 轉(zhuǎn)換產(chǎn)生的 DB2 LOAD 腳本
            -- Converting Oracle SQL*Loader Control File test2.ctl to DB2
            -- DB2 LOAD Script
            LOAD FROM "data\test2.data"
            OF DEL
            MODIFIED BY COLDEL0x09 ANYORDER USEDEFAULTS TIMESTAMPFORMAT="YYYY-MM-DD"
            DUMPFILE="dump\admin_table2.dump"
            METHOD P
            (
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
            )
            MESSAGES "msg\admin_table2.msg"
            INSERT INTO "ADMIN"."TABLE2"
            ( CR_BUR_PTFLO_TYP_DESC
            ,DW_PROD_SERV_FEE_PLN_RCD_ID
            ,DW_ULT_PROD_SERV_ID
            ,ACCT_NBR
            ,ACCT_GRP_NBR
            ,APPL_CDE
            ,PRCS_GRP_NBR
            ,FEE_CAT_CDE
            ,FEE_PLN_NBR
            ,FEE_DESC
            ,FEE_TYP_CDE
            ,FEE_EARN_CDE
            ,CMPT_1_NXT_ASSMT_DTE
            ,CMPT_2_NXT_ASSMT_DTE
            ,CMPT_3_NXT_ASSMT_DTE
            ,CUR_PMT_DUE_DTE
            ,EARN_GOOD_THRU_1_DTE
            ,EARN_GOOD_THRU_2_DTE
            ,PR_PMT_DUE_DTE
            ,NXT_PMT_DUE_DTE
            ,DW_ASP_ID
            ,CLNT_ID
            ,CUR_REC_IND
            ,SOR_EXP_DTE
            ,EFF_DTE
            )
            NONRECOVERABLE
            INDEXING MODE AUTOSELECT
            ;
            -- UPDATE Statements for setting proper NULLIF parameters
            UPDATE "ADMIN"."TABLE2"
            SET CR_BUR_PTFLO_TYP_DESC = NULL
            WHERE  TRIM(CR_BUR_PTFLO_TYP_DESC) = '';
            UPDATE "ADMIN"."TABLE2"
            SET SOR_EXP_DTE = COALESCE(SOR_EXP_DTE,'4444-12-31-00.00.00');
            

注意,因?yàn)?DB2 不允許在 DB2 LOAD 腳本中使用 CONSTANT 關(guān)鍵字,所以 CONSTANT 列被轉(zhuǎn)換為帶 DEFAULT 子句的 ALTER TABLE 語(yǔ)句。DB2 LOAD 會(huì)在裝載數(shù)據(jù)時(shí)應(yīng)用 DEFAULT 值,而 SQL*Loader 直接路徑不應(yīng)用默認(rèn)值。

還要注意 Oracle 控制文件 test1.ctl 示例中 UNRECOVERABLE 選項(xiàng)(使用直接路徑)中的 SQL 字符串,但是直接路徑忽略這些 SQL 字符串。在 DB2 中可以忽略轉(zhuǎn)換產(chǎn)生的等效更新語(yǔ)句。

上面的轉(zhuǎn)換過(guò)程產(chǎn)生了一些 UPDATE 語(yǔ)句,它們根據(jù)應(yīng)用的 SQL 字符串修改數(shù)據(jù)。如果由于性能問(wèn)題不愿意在非常大的表上應(yīng)用這些 UPDATE 語(yǔ)句,那么可以用另一個(gè)選項(xiàng) SOURCEUSEREXIT 修改數(shù)據(jù)文件,下一節(jié)解釋這個(gè)選項(xiàng)。





回頁(yè)首


DB2 LOAD 的 USEREXIT

DB2 和 Oracle 在體系結(jié)構(gòu)方面的主要差異之一是如何處理空字符串。Oracle 把空字符串當(dāng)作 NULL 對(duì)待,而 DB2 不是這樣。如果 SQL*Loader 控制文件中使用位置列,那么在使用 LOAD 實(shí)用程序裝載數(shù)據(jù)時(shí),這個(gè)差異可能會(huì)導(dǎo)致錯(cuò)誤。如果這些列是空的,DB2 就認(rèn)為它們是空的,而 Oracle 認(rèn)為它們是 NULL。

在下面的示例數(shù)據(jù)中,在位置 23 和 32 上有 NULL 標(biāo)志,它們分別針對(duì)在位置 24:27 和 28:31 上定義的數(shù)據(jù):


清單 8. NULL 標(biāo)志
            FILE1 has 7 elements:
            ELE1 positions 01 to 20
            ELE2 positions 21 to 22
            ELE3 positions 23 to 23
            ELE4 positions 24 to 27
            ELE5 positions 28 to 31
            ELE6 positions 32 to 32
            ELE7 positions 33 to 40
            1...5...10...15...20...25...30...35...40
            Test data 1         XXN 123abcdN
            Test data 2 and 3   QQY    wxyzN
            Test data 4,5 and 6 WWN6789    Y
            

下面的 LOAD 腳本使用 NULL INDICATORS 選項(xiàng),如果 NULL 標(biāo)志設(shè)置為 Y,腳本就會(huì)把列當(dāng)作 NULL:


清單 9. NULL INDICATORS 選項(xiàng)
            TABLE has 5 columns:
            COL1 VARCHAR 20 NOT NULL WITH DEFAULT
            COL2 SMALLINT
            COL3 CHAR 4
            COL4 CHAR 2 NOT NULL WITH DEFAULT
            COL5 CHAR 2 NOT NULL
            db2 load from file1 of asc modified by striptblanks reclen=40
            method L (1 20, 21 22, 24 27, 28 31)
            null indicators (0,0,23,32)
            insert into table1 (col1, col5, col2, col3)
            

以 Oracle 控制腳本 test1.ctl 為例(使用我們的 Perl 腳本執(zhí)行轉(zhuǎn)換)。為了裝載 null 值,DB2 LOAD 要求專(zhuān)門(mén)指定 NULL INDICATORS。這要求為數(shù)據(jù)文件中每個(gè)記錄的所有列添加 NULL 標(biāo)志。對(duì)于這樣的情況,可以使用 DB2 LOAD SOURCEUSEREXIT 選項(xiàng)根據(jù)用戶(hù)退出程序中的邏輯修改數(shù)據(jù)文件。采用這種方法,就不需要在運(yùn)行 LOAD 之前處理數(shù)據(jù)文件。使用 SOURCEUSEREXIT 選項(xiàng)會(huì)讓 DB2 LOAD 讀取數(shù)據(jù)文件并把數(shù)據(jù)記錄傳輸給可以處理記錄的用戶(hù)退出程序,處理之后再傳遞給 DB2 LOAD。


清單 10. 使用 SOURCEUSEREXIT 的 DB2 LOAD 腳本
            LOAD FROM data\test1.data
            OF ASC
            MODIFIED BY ANYORDER USEDEFAULTS STRIPTBLANKS TIMESTAMPFORMAT="YYYY-MM-DD"
            DUMPFILE="dump\admin_table1.dump"
            METHOD L
            (
            2 4
            ,5 12
            ,13 18
            ,19 26
            ,27 40
            ,41 41
            ,42 53
            ,54 56
            ,57 76
            ,77 78
            ,79 90
            ,91 98
            ,99 106
            ,107 107
            )
            NULL INDICATORS (108,109,110,111,112,113,0,114,115,116,117,118,119,120)
            MESSAGES "msg\admin_table1.msg"
            INSERT INTO "ADMIN"."TABLE1"
            ( BC_OFF_BCBANK
            ,BC_OFF_SEGMENT_TYPE
            ,BC_OFF_NUM
            ,BC_OFF_SQ_EFF_DATE
            ,BC_OFF_SQ_ENT_DATE
            ,BC_OFF_DELETE
            ,BC_OFF_EFF_DATE
            ,BC_OFF_INITIALS
            ,BC_OFF_NAME
            ,BC_OFF_C_L_SECTION
            ,BC_OFF_PHONE_NR
            ,BC_OFF_SC_LND_LMT
            ,BC_OFF_UNSC_LND_LMT
            ,BC_OFF_NEWCOL
            )
            NONRECOVERABLE
            INDEXING MODE AUTOSELECT
            SOURCEUSEREXIT userexit.pl redirect input from buffer 'colninds:(2 4,5 12,
            13 18,19 26,27 40,41 41,42 53,54 56,57 76,77 78,79 90,91 98,99 106,
            107 107) nullinds:(108,109,110,111,112,113,0, 114,115,116,117,118,
            119,120)'
            output to file userexit.log
            ;
            



注意:
  1. 這個(gè) DB2 LOAD 腳本(見(jiàn)左邊)并不是由 Perl 腳本生成,并經(jīng)過(guò)手工修改(粗體顯示)。這個(gè)示例演示在 DB2 LOAD 腳本中如何使用 SOURCEUSEREXIT 選項(xiàng)在運(yùn)行時(shí)修改數(shù)據(jù)文件。如果數(shù)據(jù)文件的大小為幾 GB 或 TB,而且不能把文件空間加大一倍,那么這種做法會(huì)非常有幫助。
  2. 這個(gè) LOAD 命令中的 SOURCEUSEREXIT 選項(xiàng)指定 Perl 腳本 userexit.pl 作為源用戶(hù)退出程序,這個(gè)程序使用(通過(guò) LOAD 傳遞給它的)緩沖區(qū)字符串修改數(shù)據(jù)文件,在每個(gè)記錄的末尾添加 NULL 標(biāo)志,讓 DB2 可以正確地處理 NULL。
  3. 這個(gè) Perl 腳本(userexit.pl)在運(yùn)行時(shí)修改數(shù)據(jù),它應(yīng)該保存在服務(wù)器上的 sqllib 目錄中,這樣 LOAD 才能找到它。
  4. 可以在 userexit.pl 腳本中使用日志語(yǔ)句,并使用 OUTPUT TO FILE 選項(xiàng)把輸出放到一個(gè)文件中。
  5. 這個(gè) Perl 腳本應(yīng)該以一種特定風(fēng)格處理參數(shù),細(xì)節(jié)請(qǐng)參考 DB2 文檔或 userexit.pl。




回頁(yè)首


結(jié)束語(yǔ)

Oracle DBA 熟悉 SQL*Loader,他們很容易利用這些知識(shí)學(xué)習(xí) DB2 LOADIMPORT 實(shí)用程序。本文主要關(guān)注 LOAD,但是許多內(nèi)容也可以應(yīng)用于 IMPORT。本文討論并對(duì)比了 SQL*Loader 和 DB2 LOAD 的主要關(guān)鍵字。還提供了一個(gè)容易使用的 Perl 腳本,它可以轉(zhuǎn)換大多數(shù) SQL*Loader 腳本。這應(yīng)該能夠幫助您的組織更輕松地遷移到 DB2。





回頁(yè)首


致謝

本文的作者感謝 IBM 多倫多實(shí)驗(yàn)室的 David Sciaraffa,他提供了在記錄中添加 NULL 標(biāo)志的 userexit.pl 程序示例。






回頁(yè)首


下載

描述 名字 大小 下載方法
將 SQL*Loader 遷移到 DB2 Load 的 Perl 腳本 db2load.zip 10KB HTTP
關(guān)于下載方法的信息


參考資料

學(xué)習(xí)

獲得產(chǎn)品和技術(shù)
  • DB2 9.5 Enterprise Edition:下載 DB2 9.5 Enterprise Edition 的免費(fèi)試用版。

  • DB2 9.5 Express-C:下載 DB2 9.5 Express-C 的免費(fèi)許可證。

  • 使用可從 developerWorks 直接下載的 IBM 試用軟件 構(gòu)建您的下一個(gè)開(kāi)發(fā)項(xiàng)目。


討論


作者簡(jiǎn)介

Burt Vialpando

Burt Vialpando 在 1984 年成為 IT 專(zhuān)業(yè)人員,并從 1998 年開(kāi)始為 IBM 工作,從事與數(shù)據(jù)庫(kù)遷移相關(guān)的項(xiàng)目。他目前擔(dān)任 Oracle 到 DB2 遷移方面的技術(shù)售前專(zhuān)家,曾經(jīng)主持差不多 80 場(chǎng)技術(shù)證明會(huì),與會(huì)的 DBA 超過(guò) 1,200 人。他是許多圖書(shū)、文章、文件、PoT 和其他資料的作者或合作作者。Burt 擁有許多 DB2、Oracle 和其他 IT 認(rèn)證,還擁有多項(xiàng) IBM 專(zhuān)利。


 

Vikram Khatri 在 IBM 的 Sales and Distribution 部門(mén)工作,是 DB2 Migration 小組的一員。Vikram 有 21 年的 IT 從業(yè)經(jīng)驗(yàn),擅長(zhǎng)把非 DB2 數(shù)據(jù)庫(kù)遷移到 DB2。Vikram 支持 DB2 技術(shù)銷(xiāo)售組織的工作,幫助他們完成復(fù)雜的數(shù)據(jù)庫(kù)遷移項(xiàng)目和數(shù)據(jù)庫(kù)性能基準(zhǔn)測(cè)試。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多