ご使用のブラウザはJavaScriptをサポートしていません。このヘルプ・ページを正しく表示するにはJavaScriptが必要です。 SQL*Loaderマッピングでの参照整合性を確認するためのダイレクト・パス・ロードの使用
ヘッダーをスキップ
前へ
前へ
 
次へ
次へ

SQL*Loaderマッピングでの参照整合性を確認するためのダイレクト・パス・ロードの使用

マスター・レコードに一意のフィールドがある(または複数のフィールドを連結した結果、一意の識別子がある)マスター・ディテール・フラット・ファイルを使用している場合は、オプションのダイレクト・パス・ロードを使用すると、ロードを高速化できます。

ダイレクト・パス・ロードの場合、各レコードのレコード番号(RECNUM)はマスター表とディテール表に格納されます。ロード後の手順では、このRECNUMを使用して、各ディテール行を、対応するマスター行の一意の識別子で更新します。

この手順では、このようなマッピングを作成するための一般的な方法を概説します。次に示す詳細な手順も参照してください。

ダイレクト・パス・ロードを使用してマスター・ディテール・フラット・ファイルから抽出し、マスター・ディテール関係を維持する手順は、次のとおりです。

  1. マスター・レコードとディテール・レコードで構成されたフラット・ファイル・ソースをインポートして、サンプリングします。

    ファイルのサンプリング時にレコード・タイプに名前を指定する場合は、マスター・レコードとディテール・レコードに説明的な名前を割り当てます。これによって、今後はこれらのレコードを容易に識別できます。

  2. フラット・ファイル・ソースからデータをロードするために使用するマッピングを作成します。

  3. フラット・ファイル演算子をマッピング・キャンバスにドラッグ・アンド・ドロップし、データの抽出元のマスター・ディテール・ファイルを指定します。

  4. データ・ジェネレータ演算子および定数演算子をマッピング・キャンバスにドラッグ・アンド・ドロップします。

  5. マスター・レコードに対する表演算子をマッピング・キャンバスにドラッグ・アンド・ドロップします。

    以前作成した既存のワークスペース表を選択するか、属性を指定せずにバインドなしで新しい表演算子を作成し、アウトバウンド同期化を実行して後で表を定義できるようにします。

    この表には、ロードするマスター・フィールドに必要なすべての列と、RECNUM値をロードするための追加の数値列が含まれている必要があります。

  6. ディテール・レコードに対する表演算子をマッピング・キャンバスにドラッグ・アンド・ドロップします。

    以前作成した既存のワークスペース表を選択するか、属性を指定せずにバインドなしで新しい表演算子を作成し、アウトバウンド同期化を実行して後で表を定義できるようにします。

    表には、ロードするディテール・フィールドに必要なすべての列と、RECNUM値をロードするための追加の数値列、および対応するマスター表の行の一意の識別子で更新する列が含まれている必要があります。

  7. 必要なすべてのフラット・ファイル・マスター・フィールドをマスター表に、ディテール・フィールドをディテール表にマッピングします。

  8. データ・ジェネレータ演算子のRECNUM属性をマスター表とディテール表のRECNUM列にマップします。

  9. 定数演算子の定数属性を追加します。

    マスター行の一意の識別子列がCHARデータ型である場合は、式'*'を使用して定数属性をCHAR型にします。

    マスター行の一意の識別子列が数値である場合は、式'0'を使用して定数属性をNUMBERにします。

  10. 定数演算子の定数属性をディテール表の列にマッピングします。この列には、対応するマスター表レコードの一意の識別子が後で格納されます。

  11. 次のパラメータを使用して、マッピングを構成します。

    ダイレクト・モード: True

    エラー許可: 0

    後続NULL列: True(すべての表)

  12. マッピングを検証し、SQL*Loaderスクリプトを生成した後は、更新後のPL/SQLプロシージャを作成し、それをWarehouse Builderライブラリに追加します。

  13. SQL*Loaderスクリプトを実行します。

  14. 更新後のPL/SQLプロシージャを実行するか、スクリプトを手動で実行して、UPDATE SQL文を実行します。

次に、生成されたSQL*Loader制御ファイルのスクリプトの例を示します。

OPTIONS ( DIRECT=TRUE,PARALLEL=FALSE, ERRORS=0, BINDSIZE=50000, ROWS=200, READSIZE=65536)
LOAD DATA
CHARACTERSET WE8MSWIN1252
  INFILE 'g:\FFAS\DMR2.dat'
  READBUFFERS 4
  INTO TABLE "MATER_TABLE"
  APPEND
  REENABLE DISABLED_CONSTRAINTS
       WHEN 
        "REC_TYPE"='P'
  FIELDS
    TERMINATED BY ','
                OPTIONALLY ENCLOSED BY '"'
                TRAILING NULLCOLS
    
                (
                "REC_TYPE" POSITION (1) CHAR ,
                "EMP_ID" CHAR ,
                "ENAME" CHAR ,
                "REC_NUM" RECNUM
                )
  
INTO TABLE "DETAIL_TABLE"
                APPEND
                REENABLE DISABLED_CONSTRAINTS
                WHEN 
                "REC_TYPE"='E'
                FIELDS
                TERMINATED BY ','
                OPTIONALLY ENCLOSED BY '"'
                TRAILING NULLCOLS
        (
                "REC_TYPE" POSITION (1) CHAR ,
                "C1" CHAR ,
                "C2" CHAR ,
                "C3" CHAR ,
                "EMP_ID" CONSTANT '*',
         "REC_NUM" RECNUM

次に、更新後のPL/SQLプロシージャの例を示します。

  create or replace procedure wb_md_post_update( 
     master_table varchar2 
    ,master_recnum_column varchar2 
    ,master_unique_column varchar2 
    ,detail_table varchar2 
    ,detail_recnum_column varchar2 
    ,detail_masterunique_column varchar2 
    ,detail_just_load_condition varchar2) 
  IS 
     v_SqlStmt VARCHAR2(1000); 
  BEGIN 
     v_SqlStmt := 'UPDATE '||detail_table||' l '|| 
                  ' SET l.'||detail_masterunique_column||' = (select i.'||master_unique_column|| 
                  ' from '||master_table||' i '|| 
                  ' WHERE i.'||master_recnum_column||' IN '|| 
                  ' (select max(ii.'||master_recnum_column||') '|| 
                  ' from '||master_table||' ii '|| 
                  ' WHERE ii.'||master_recnum_column||' < l.'||detail_recnum_column||') '|| 
                  ' ) '|| 
                  ' WHERE l.'||detail_masterunique_column||' = '||''''||detail_just_load_condition||''''; 
     dbms_output.put_line(v_sqlStmt); 
     EXECUTE IMMEDIATE  v_SqlStmt; 
  END; 
  /