SQLLDR - WHEN子句的问题

时间:2011-02-18 09:51:17

标签: sql-loader

我的控制文件中有多个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

由于

1 个答案:

答案 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