2011-02-18 376 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使用另外两个块?