我的控制文件中有多个when子句,我在其中一半加载的数据满足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 :(得分:0)
我在示例数据上使用了SQL * Loader,并在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
?