SQLLDR - проблема с предложениями WHEN - PullRequest
2 голосов
/ 18 февраля 2011

В моем контрольном файле есть несколько предложений 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, но файл сброса не создается.Я попробовал это с одним, когда предложение и файл сброса создан, кажется, используя более одной таблицы, файл сброса не создан.

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 голосов
/ 18 февраля 2011

Я использовал 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, используя два других блока?

...