2

制御ファイルに複数の when 句があり、その半分にロードしているデータが 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 句を 1 つ使用してみましたが、破棄ファイルが作成されました。破棄ファイルが作成されていない複数のテーブルを使用しているようです。

ACC000000001、CUSTID213、MARC_VAF、1234、ペット、0、N、N、FULL
ACC000000002、CUSTID214、TOBY_123、1352、ベイリー、1、Y、N、FULL
ACC000000003,CUSTID215,KEVIN_VAF81,YY33OF,水,2,Y,N,FULL
ACC000000015、CUSTID227、SAM_EGD、CARRY42、何らかのパスワード、-3、Y、N、FULL

ありがとう

4

1 に答える 1

0

サンプルデータでSQL*Loaderを使用しましたが、SQL*Loaderが残したログファイルで次のことがわかりました。

テーブル"DCVPAPP"。"RBS_CC_CUSTOMERINFO":
  4行が正常にロードされました。      
  0データエラーのために行がロードされていません。
  0すべてのWHEN句が失敗したため、行がロードされませんでした。
  0すべてのフィールドがnullであったため、行はロードされませんでした。

テーブル"DCVPAPP"。"RBS_CC_SECURITYDETAILS":
  0行が正常にロードされました。
  0データエラーのために行がロードされていません。
  4すべてのWHEN句が失敗したため、行がロードされませんでした。
  0すべてのフィールドがnullであったため、行はロードされませんでした。

テーブル"DCVPAPP"。"RBS_CC_SECURITYDETAILS":
  0行が正常にロードされました。
  0データエラーのために行がロードされていません。
  4すべてのWHEN句が失敗したため、行がロードされませんでした。
  0すべてのフィールドがnullであったため、行はロードされませんでした。

WHEN最初のブロックでは、失敗する句がなかったため、すべてのデータがロードされました。WHEN他の2つでは、すべての行が句に失敗しました。最初のブロックは4行すべてをロードしたため、破棄ファイルに書き込むものがなかったため、SQL*Loaderは1つを作成しませんでした。

次の2つのブロックのWHEN句は、サンプルデータの終わりから遠く離れたデータの一部を参照しているようです。どちらも位置477以降のデータを使用しているように見えますが、サンプルデータの最長行はわずか68文字です。各フィールドには最大で1つの末尾のスペースがあるため、サンプルデータが何らかの形で壊れており、上記よりも多くのスペースがあるはずであると想定します。

とにかく、私はあなたのコントロールファイルの挿入するセクションをコメントアウトしRBS_CC_CUSTOMERINFO、テーブルを空にしてSQL*Loaderを再実行しました。今回は、4行すべてが破棄ファイルに書き込まれました。

2つの句のどちらにも一致しないデータをWHEN破棄ファイルに書き込む場合は、制御ファイルを2つの別々の制御ファイルに分割します。1つRBS_CC_CUSTOMERINFOは最初のブロックを使用してデータをロードし、もう1つはもう一方のブロックを使用してデータをロードしますRBS_CC_SECURITYDETAILS。 2ブロック?

于 2011-02-18T11:00:29.333 に答える