2011-02-18 383 views
2

我在控制文件中有多個when子句,我在其中一半加載的數據滿足when子句並被插入到所需的表中。另一半沒有(我期望),但我期待的數據不符合什麼時候將條件放入放棄文件中,但沒有創建。SQLLDR - WHEN子句的問題

任何想法?

LOAD DATA 
INFILE '/u04/app/vpht_app/flat_files/icr_load/marc/sqlldr_load/CSSO_CCRBSCREDENTIALS_COMSUMER23062010160322.txt' 
BADFILE '/u04/app/vpht_app/flat_files/icr_load/marc/sqlldr_load/CSSO_CCRBSCREDENTIALS_COMSUMER23062010160322.bad' 
DISCARDFILE '/u04/app/vpht_app/flat_files/icr_load/marc/sqlldr_load/CSSO_CCRBSCREDENTIALS_COMSUMER23062010160322.dsc' 
INSERT 

INTO TABLE "DCVPAPP"."RBS_CC_CUSTOMERINFO" 
INSERT 
FIELDS TERMINATED BY ',' 
TRAILING NULLCOLS 
(CC_USER_NAME POSITION(24:73), 
ACCOUNTID POSITION(1:12), 
CUSTOMERID POSITION(14:22)) 

INTO TABLE "DCVPAPP"."RBS_CC_SECURITYDETAILS" 
WHEN (481:481) = 'N' AND (477:479) ='0' 
FIELDS TERMINATED BY ',' 
TRAILING NULLCOLS 
(
CC_USER_NAME POSITION(24:73), 
RBSPIN POSITION(75:274), 
RBSPASSWORD POSITION(276:475), 
fill1 filler, 
fill2 filler, 
fill3 filler, 
fill4 filler, 
FAILCODECOUNT POSITION(477:479), 
FAILPASSWORDCOUNT POSITION(477:479) 
) 

INTO TABLE "DCVPAPP"."RBS_CC_SECURITYDETAILS" 
WHEN (481:481) = 'N' AND (477:479) ='1' 
FIELDS TERMINATED BY ',' 
TRAILING NULLCOLS 
(
CC_USER_NAME POSITION(24:73), 
RBSPIN POSITION(75:274), 
RBSPASSWORD POSITION(276:475), 
fill1 filler, 
fill2 filler, 
fill3 filler, 
fill4 filler, 
FAILCODECOUNT POSITION(477:479), 
FAILPASSWORDCOUNT POSITION(477:479) 
) 

我的表結構是:

Create table RBS_CC_CUSTOMERINFO 
(
CC_USER_NAME VARCHAR2(50), 
ACCOUNTID VARCHAR2(12) NOT NULL, 
CUSTOMERID VARCHAR2(9) NOT NULL, 
CUST_MIGRATION_STATUS VARCHAR2(1) DEFAULT 'N' NOT NULL, 
CONSTRAINT pk_01 PRIMARY KEY (CC_USER_NAME) 
); 

Create table RBS_CC_SECURITYDETAILS 
(
CC_USER_NAME VARCHAR2(50), 
RBSPIN VARCHAR2(200) NOT NULL, 
RBSPASSWORD VARCHAR2(200) NOT NULL, 
FAILCODECOUNT NUMBER (9) NOT NULL, 
FAILPASSWORDCOUNT NUMBER (9) NOT NULL, 
CONSTRAINT pk_secur 
FOREIGN KEY (CC_USER_NAME) 
REFERENCES RBS_CC_CUSTOMERINFO(CC_USER_NAME) 
) 

和我下面的樣本數據(這些是正確的填充,因爲這些都是固定字段)的最後一個記錄應該被丟棄,並放置在一邊的廢棄文件因爲它不符合任何when子句的條件,但沒有創建丟棄文件。我已經用一個when子句和丟棄文件創建了它,似乎使用多個表創建丟棄文件。

 
ACC000000001,CUSTID213,MARC_VAF ,1234 ,pet ,0 ,N,N,FULL 
ACC000000002,CUSTID214,TOBY_123 ,1352 ,bailey ,1 ,Y,N,FULL 
ACC000000003,CUSTID215,KEVIN_VAF81 ,YY33OF ,water ,2 ,Y,N,FULL 
ACC000000015,CUSTID227,SAM_EGD ,CARRY42 ,some password ,-3 ,Y,N,FULL 

感謝

+0

多個INSERT行是否正常? – Benoit 2011-02-18 10:10:59

回答

0

我使用SQL *你的樣本數據裝載機,發現在SQL * Loader的留下的日誌文件如下:

 
Table "DCVPAPP"."RBS_CC_CUSTOMERINFO": 
    4 Rows successfully loaded.  
    0 Rows not loaded due to data errors. 
    0 Rows not loaded because all WHEN clauses were failed. 
    0 Rows not loaded because all fields were null. 

Table "DCVPAPP"."RBS_CC_SECURITYDETAILS": 
    0 Rows successfully loaded. 
    0 Rows not loaded due to data errors. 
    4 Rows not loaded because all WHEN clauses were failed. 
    0 Rows not loaded because all fields were null. 

Table "DCVPAPP"."RBS_CC_SECURITYDETAILS": 
    0 Rows successfully loaded. 
    0 Rows not loaded due to data errors. 
    4 Rows not loaded because all WHEN clauses were failed. 
    0 Rows not loaded because all fields were null. 

在第一組,所有數據被加載,因爲沒有WHEN條款失敗。與其他兩個,所有行都失敗了WHEN子句。由於第一個塊加載了全部四行,因此沒有任何內容寫入放棄文件,因此SQL * Loader未創建一個。

在後面兩個塊中的WHEN子句似乎在您的示例數據的末尾引用數據的很長一段距離。他們似乎都使用477以後的數據,而樣本數據中最長的一行只有68個字符。由於每個字段最多隻有一個尾部空間,因此我會假設您的示例數據不知何故被破壞,並且應該有比上述更多的空間。

無論如何,我已經註釋掉了控制文件中插入到RBS_CC_CUSTOMERINFO中的部分,清空了表並重新運行了SQL * Loader。這一次,所有四行都被寫入放棄文件。

如果你想匹配既不兩個WHEN條款被寫入到一個廢棄文件數據,如何分割控制文件分爲兩個獨立的控制文件,其中一個使用第一塊中的數據加載到RBS_CC_CUSTOMERINFO,和其中一個加載將數據轉換爲RBS_CC_SECURITYDETAILS使用另外兩個塊?