マッピング・エディタには、事前に作成済の一連のマッピング演算子が用意されています。これらの演算子を使用して、ソースからターゲットへのデータ移動方法を指定する共通の変換を定義できます。
この章では、マッピングに演算子を使用してデータを変換する方法について説明します。マッピングの設計に役立つウィザードが用意されている演算子があります。また、SQL式の記述に役立つ式ビルダーを起動できる演算子もあります。
この章の内容は次のとおりです。
設計に関して様々な決定を行う必要がある演算子の場合、演算子の定義を指示するウィザードが用意されています。各ウィザードは、実行する必要がある手順の概要を示すようこそページから始まります。各ウィザードは、選択内容をリストするサマリー・ページで終わります。ウィザードでナビゲートするには「次へ」および「戻る」を使用します。演算子ウィザードを閉じるには、任意のウィザード・ページで「終了」をクリックします。
次の演算子には、ユーザーをサポートするウィザードがあります。
Match-Merge演算子。「Match-Merge演算子による重複ソース・レコードの削除」を参照してください。
Name and Address演算子。詳細は、「Name and Address演算子を使用した正しい名前および住所データのクレンジングおよび訂正」を参照してください。
演算子を定義する作業への習熟後は、ウィザードを無効化し、かわりに演算子エディタを使用することもできます。演算子エディタを起動するには、マッピング・エディタで演算子を右クリックして「詳細を開く」を選択します。演算子エディタでは、ウィザードと同じ内容が、ウィザード・ページではなくタブ形式で表示されます。
演算子ウィザードまたは演算子エディタのどちらを使用する場合も、演算子ごとに次の各ページを完了する必要があります。
一般ページを使用して、演算子の名前と説明(オプション)を指定します。デフォルトでは、ウィザードにより演算子の種類が名前として割り当てられます。たとえば、新しいピボット演算子のデフォルト名は「ピボット」です。
「グループ」タブで、グループ情報を編集します。
各グループには、名前、方向および説明(オプション)が表示されます。ほとんどの演算子のグループ名は変更できますが、どの演算子の場合もグループの方向は変更できません。グループの方向には、「入力」、「出力」、「I/O」のいずれかを指定できます。
演算子によっては、「グループ」タブでグループを追加および削除できます。たとえば、入力グループを「ジョイナ」に、出力グループを「スプリッタ」に追加します。
演算子エディタには、「グループ」タブに表示されているグループのタイプごとに、タブが1つずつ表示されます。これらのタブには、属性名、データ型、長さ、精度、スケールおよび説明(オプション)が表示されます。
演算子によっては、属性を追加、削除および編集できます。マッピング・エディタでは、編集できないプロパティはグレー表示になります。たとえば、データ型がNUMBER
の場合、精度とスケールは編集できますが、長さは編集できません。
接続の入力ページを使用して、属性を演算子にコピーおよびマッピングします。選択する属性は、入力グループのマッピング・メンバーとなります。「使用可能な属性」パネルには、マッピングの全演算子のリストが表示されます。
演算子の接続の入力ページで指定する手順は次のとおりです。
「使用可能な属性」パネルで、グループ全体または個別の属性を選択します。
名前で特定の属性またはグループを検索するには、「検索」にテキストを入力し、「実行」を選択します。次の一致を検索するには、「実行」を再度選択します。
複数のグループまたは属性を選択するには、[Shift]キーを押しながら選択します。異なるグループの属性を選択するには、最初にジョイナ演算子または集合演算子を使用してグループを結合する必要があります。
2つのパネルの間にある右矢印ボタンを使用して、選択内容を「マップ済属性」パネルに移動します。
接続の入力のリストからグループまたは属性を削除するには、左矢印を使用できます。選択内容が入力グループから削除され、ソース演算子と現行の演算子の間のデータ・フロー接続も削除されます。
一部のデータ・フロー演算子の場合は式を作成する必要があります。式とは、データを変換したり制限を指定する文または句です。これらの式は、SQL文の一部としてインラインで使用されるSQLの各部を構成します。それぞれの式は、データ・フロー演算子のロールにより決定されるタイプに属しています。式を作成するには、式ビルダーを使用する方法と、演算子または演算子の属性のプロパティ・インスペクタの「式」フィールドに入力する方法があります。
フィルタ、ジョイナおよびアグリゲータなどの演算子の場合、演算子のプロパティ・インスペクタから式ビルダーを開くことができます。式、データ・ジェネレータ、スプリッタおよび定数などの演算子の場合は、演算子属性のプロパティ・インスペクタから式ビルダーを開くことができます。
式ビルダーを開く手順は、次のとおりです。
マッピング・エディタで、式ビルダーを開く演算子または属性を選択します。
プロパティ・インスペクタに、選択した演算子または演算子属性のプロパティが表示されます。
プロパティ・インスペクタで、式ビルダーを使用して設定するプロパティの省略記号ボタンをクリックします。
図26-1のような式ビルダーが表示されます。
式を作成するには、次の方法があります。
式ビルダーの右側にある「式」フィールドにテキストを入力します。
左パネルの「入力」タブと「変換」タブからアイテムをドラッグし、右側の「式」フィールドにドロップします。
左パネルの「入力」タブと「変換」タブでアイテムをダブルクリックします。
「式」フィールドの下で使用可能な算術演算子のボタンをクリックします。
「検証」をクリックします。
式の構文が正確であることが検証されます。
「OK」をクリックし、式を保存して式ビルダーを閉じます。
「式ビルダー」の構成は、次のとおりです。
左側のパネルのナビゲーション・ツリーには次の2つのタブが表示されます。
「入力」タブ:入力パラメータのリストです。
「変換」タブ: パブリックOracle事前定義済ライブラリ、パブリックOracleカスタム・ライブラリ、プライベートOracleライブラリにある事前定義済のファンクションおよびプロシージャのリストです。
「式」フィールド: 右側のパネルの上部には、「式」フィールドがあります。このフィールドを使用して、式の入力や編集を行います。
算術演算子ボタン: 「式」フィールドの下には、算術演算子ボタンがあります。このボタンを使用すると、手動で入力しなくても式を作成できます。使用できる算術演算子は、アクティブなデータ・フロー演算子のタイプによって異なります。
その他: アクティブな式タイプに該当する、使用可能なSQL句のリストです。
Oracle9i Databaseからは、DECODE
ファンクションのかわりにCASE
ファンクションの使用が推奨されています。これは、DECODE
ファンクションではSQLしか生成できませんが、CASE
ファンクションではSQLとPL/SQLの両方を生成できるためです。式にDECODE
ファンクションを使用すると、コード生成時にCASE
ファンクションに変換されます(該当する場合)。つまり、すべてのオペレーティング・モード(セットベース、行ベースなど)でDECODE
の機能を配布でき、Oracle Databaseのリリース(8.1、9.0以上)を意識しなくても済みます。
たとえば、次のファンクション
DECODE (T1.A, 1, 'ABC', 2, 'DEF', 3, 'GHI', 'JKL')
は、次のファンクションに変換されます。
CASE T1.A WHEN 1 THEN 'ABC' WHEN 2 THEN 'DEF' WHEN 3 THEN 'GHI' ELSE 'JKL'
「検証」ボタン: このボタンを使用して、式ビルダーの現在の式を検証します。式を検証すると、その式で参照しているすべてのマッピング・オブジェクトにワークスペース・オブジェクトが関連付けられていることを確認できます。式ビルダーで作成できる式は、演算子の入力とそのプロジェクトで実行可能な変換のみです。この制限によって、演算子の外部の要素が変更されたときの式の無効化を防止できます。配布データベースがデザイン・ワークスペースと異なる場合、データベースが式を受け付けないことがあります。式が有効でも、データベースに対して不適切である場合にこの現象が発生します。このような場合、式エラーは配布時にのみ検出できます。
「検証結果」フィールド: 右側のパネルの下部には、「検証結果」フィールドがあります。このフィールドの右側にある「検証」ボタンを選択すると、このフィールドでは検証結果が表示されます。
アグリゲータ演算子は、入力データの合計や平均などのデータ集計を計算します。集計データを含む出力行セットを提供します。
アグリゲータ演算子では、入力グループ1つと出力グループ1つを使用します。出力グループの場合は、集計の実行対象の属性を指定するGROUP BY句を定義します。オプションで、集計データを制限するHAVING句も指定できます。出力グループ内の各属性は同じカーディナリティを持ちます。出力行セットの行数は、入力行数以下になります。
アグリゲータ演算子を1つ使用して複数の集計を実行できます。アグリゲータの出力グループに含まれる属性ごとに異なる集計関数を指定できますが、各アグリゲータでサポートされているGROUP BY句とHAVING句はそれぞれ1つのみです。
図26-2に、アグリゲータ演算子を使用してチャネルと製品の売上合計を集計するマッピングを示します。出力属性の式プロパティを使用して、属性TOTAL_SALES
に適用する集計関数がSUMであることを指定しています。アグリゲータ演算子のGroup Byプロパティを使用して、売上の集計対象にチャネルIDと製品IDを指定しています。このアグリゲータ演算子の出力は、ターゲット表SALES_FACT
にマップされます。
マッピングのアグリゲータ演算子を定義する手順は、次のとおりです。
アグリゲータ演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
キャンバス上で、アグリゲータ演算子の入力グループにソース属性を接続します。
アグリゲータ演算子を右クリックして「詳細を開く」を選択します。
アグリゲータ・エディタが表示されます。
「出力属性」タブで、集計データを格納する出力属性を作成します。
出力属性を作成するには、「属性」列の下の空のセルをクリックして属性名を入力します。属性に割り当てられているデフォルトのデータ型はNUMBER
です。データ型や、データ型に関連のある他のパラメータ(長さ、精度など)は変更できます。
出力属性が入力属性を(「入力」グループから)参照する場合、「Group By句」は自動的に設定されます。
図26-2に示した例では、出力属性を追加して属性名をTOTAL_SALESに変更しています。
各出力属性の式を定義します。属性に関連付けられた「式」列に式を直接入力できます。または、「式」フィールドの右側にある省略記号ボタンをクリックして式ビルダーを表示します。式ビルダーの使用方法の詳細は、「集計関数の式」を参照してください。
図26-2に示した例では、式をSUM(amount_sold)として定義しています。
「OK」をクリックしてアグリゲータ・エディタを閉じます。
演算子についてGroup By句とHaving句(オプション)を定義します。手順の詳細は、「Group By句」および「Having句」を参照してください。
アグリゲータ演算子の出力グループに含まれる属性を、ターゲットの入力グループにマップします。
Group By句では、グループごとに1行ずつサマリー行を戻すように受信行セットをグループ化する方法を定義します。グループ化の方法は、入力グループの順序付き属性リストで指定します。デフォルトのGROUP BY句はNONEです。
Group By句を定義する手順は次のとおりです。
マッピング・エディタのキャンバスでアグリゲータ演算子を選択します。
プロパティ・インスペクタにアグリゲータ演算子のプロパティが表示されます。
「Group By句」プロパティの右側の省略記号のボタンをクリックします。
「式ビルダー」が表示されます。
ソース・データのグループ化に使用する属性を「入力」タブから「アグリゲータ」セクションの「Group By句」に移動します。複数の属性を選択する場合は、カンマで属性を区切ります。
「OK」をクリックします。
Having句は、出力グループで戻される行のグループをこの条件がtrueとなるグループに限定するブール条件です。この句を指定しなければ、全グループの全サマリー行が出力グループで戻されます。
Having句を定義する手順は、次のとおりです。
属性の式プロパティでは、その属性に対して実行する集計関数を定義します。グループ化されていない各出力属性に対して、集計式の結果をDISTINCTにするかALLにするかを選択します。ALLがデフォルトです。次に例を示します。
結果DISTINCTでは、平均を計算する前にすべての重複行が削除されます。
ALL集計では、すべての行の平均値が結果として返されます。
集計関数が不要である場合は、NONEを指定します。属性の集計にNONEを指定すると、その属性は結果としてのGROUP BY関数に自動的に追加されます。
出力属性について式を定義する手順は、次のとおりです。
マッピング・キャンバス上のアグリゲータ演算子で、集計関数を定義する出力属性を選択します。
プロパティ・インスペクタに、選択した出力属性のプロパティが表示されます。
「式」プロパティの右側の省略記号のボタンをクリックします。
図26-4のような「式」ダイアログ・ボックスが表示されます。
「関数」リストから、集計関数を選択します。
集計関数として、AVG、COUNT、GROUP_ID、GROUPING、GROUPING_ID、MAX、MEDIAN、MIN、None、STDDEV、STDDEV_POP、STDDEV_SAMP、SUM、VAR_POP、VAR_SAMP、VARIANCEおよびWB_RT_CONCATを選択できます。
図26-2に示した例では、SUMを集計関数として選択します。
集計式としてALLまたはDISTINCTを選択します。
「属性」リストから、集計する属性を選択します。
図26-2に示した例では、リストからamount_sold
属性を選択します。
「前述の値の使用」をクリックして、「式」フィールドに集計式を表示します。
「OK」をクリックします。
Anydataキャスト演算子を使用すると、Sys.AnyDataタイプのオブジェクトを主タイプまたはユーザー定義タイプに変換できます。Anydataキャスト演算子はAnydata属性をソースとして受け入れ、オブジェクトを目的のタイプに変換します。
Anydataキャスト演算子は、ユーザー定義データ型および基本データ型と併用されます。キャスト演算子はフィルタとして機能します。出力グループの属性数はn
+1で、n
は入力グループの属性数です。この演算子では、入力グループ1つと出力グループ1つを使用します。入力グループは編集できます。出力グループは編集できません。出力グループに可能な操作は、属性名の変更とキャスト先のデータ型の変更のみです。他の出力グループ属性のデータ型は変更できません。
入力グループに属性を接続できます。各出力グループは、Anydata属性を含めて入力グループの属性のコピーを取得します。キャスト操作のソースとして入力グループのAnydata属性を選択する必要があります。
Anydata属性のキャスト先となるデータ型を変更した場合は、次の手順を実行する必要があります。
キャスト操作のターゲットである出力グループの属性を編集します。
属性のデータ型を変更します。
Anydataキャスト演算子はバインドされていないため、同期化操作はサポートされていません。
図26-5に、Anydataキャスト演算子を使用するマッピングを表示します。
マッピングのAnydataキャスト演算子を定義する手順は、次のとおりです。
Anydataキャスト演算子をマッピング・エディタのキャンバスにドロップします。
「Anydataキャスト」ダイアログ・ボックスが表示されます。このダイアログ・ボックスのツリーに表示される親ノードの1つを開くと、基本データ型(Anydata以外)が表示されます。他の親ノードはそれぞれモジュールに対応しています。
キャストのターゲット・タイプを選択して「終了」をクリックします。
ANYDATAキャスト演算子を右クリックして「詳細をオープン」を選択します。
ANYDATA_CASTエディタが表示されます。
「入力属性」タブで、「追加」をクリックして属性の名前、データ型およびその他のプロパティを指定します。
「OK」をクリックして演算子エディタを閉じます。
Anydataキャスト演算子の出力グループの属性をターゲットにマップします。
デュプリケータ解除演算子を使用すると、マッピングが表すSELECTコードにDISTINCT句を挿入してソースから重複データを削除できます。
たとえば、ソース表からディメンションにデータをロードした場合に、ディメンション内の上位レベルがソース内で重複していることがあります。
ソース行セットからのすべての属性が、デュプリケータ解除演算子を経由する必要があります。ソース行セットの出力の一部とデュプリケータ解除演算子の出力の一部を同じターゲット表にマッピングすることはできません。
表26-6は、PRODUCTS
ディメンションにデータをロードする間にデュプリケータ解除演算子を使用してソースの重複値を削除するマッピングを示しています。ソース表では、同じカテゴリに複数の製品が属していることがあるため、カテゴリIDの重複値が含まれています。デュプリケータ解除演算子により、これらの重複値が削除され、カテゴリIDの個別値がPRODUCTS
ディメンションにロードされます。
重複を削除する手順は、次のとおりです。
デュプリケータ解除演算子をマッピング・エディタのキャンバスにドロップします。
ソース演算子の属性をデュプリケータ解除演算子のI/Oグループに接続します。
デュプリケータ解除演算子グループの属性をターゲット演算子の属性に接続します。
式演算子を使用して、演算子の出力パラメータの1つについて非手続き型アルゴリズムを定義するSQL式を記述します。
式テキストには、入力パラメータ名、変数名およびライブラリ・ファンクションを組み合せて使用できます。SQLタイプの式を使用して、入力行セットのカーディナリティを保持しながら行セット内の行の列値データを変換するには、式演算子を使用します。この種の式を作成するには、出力属性の属性のプロパティ・ウィンドウを開き、式ビルダーを開きます。
デフォルトでは、式演算子には入力グループ1つと出力グループ1つが含まれます。
図26-7に、式演算子を使用するマッピングを示します。トランザクション表ORACLE_ORDERS
には、製品ID、単価、販売数量などのオーダー詳細が含まれています。ORDERS_FACT
表には、チャネル、製品およびオーダー間の売上合計額の集計が含まれています。式演算子は、単価を販売数量で乗算して製品ごとの売上高を計算するために使用されています。アグリゲータ演算子により、チャネル・コード、製品IDおよびオーダーID間の売上高が集計されてから、ターゲット表がロードされます。
集計関数の記述には、式演算子を使用しないでください。この場合はアグリゲータ演算子を使用します。アグリゲータ演算子の詳細は、「アグリゲータ演算子」を参照してください。
また、式が集計演算子に接続されている場合、配布コンパイル・エラーが発生する可能性があるため、式演算子の式の後に行末または連続ダッシュ(--
)のコメントを使用しないでください。その理由は、このシナリオにおける集計演算子によってカッコが追加され、そのカッコの1つがコメントによって削除されることで、カッコが欠落するためです。
マッピングの式演算子を定義する手順は、次のとおりです。
式演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
式演算子を右クリックして「詳細をオープン」を選択します。
式エディタが表示されます。
「出力属性」タブで、「属性」列の下の空のセルをクリックして出力属性を作成します。割り当てられているデフォルトのデータ型はNUMERICです。データ型およびデータ型に関連付けられた他のパラメータを変更できます。
出力属性に使用される式を定義します。
出力属性の「式」フィールドに式を直接入力します。または、「式」フィールドの右側にある省略記号ボタンをクリックし、式を直接指定できる「式ビルダー」ダイアログ・ボックスを表示します。
「OK」をクリックして式エディタを閉じます。
式出力属性を該当するターゲット属性に接続します。
ソース演算子をフィルタ演算子に接続し、フィルタ条件を適用して、行のサブセットを次の演算子に送ります。フィルタ演算子により、生成されたPL/SQLコードのSQL文またはIF文にWHERE句が挿入されて、ソースからターゲットへのデータがフィルタされます。フィルタ条件は「式ビルダー」で指定します。フィルタ条件には、サポートされるデータ型をすべて使用でき、定数を含めることもできます。
フィルタ演算子に使用するのはI/Oグループ1つのみで、このグループをソース行セットとターゲット行セットの両方に接続できます。結果の行セットは、ブール・フィルタ条件式に基づいてソース行セットがフィルタされた後のサブセットです。ターゲット側で必要な行はすべて、フィルタ演算子を通過する必要があります。フィルタをバイパスしてターゲットに直接挿入できる行セットはなくなります。
フィルタ演算子を含むマッピングの場合、フィルタ条件式をセット・ベース表示モード用にWHERE句として表示するコードが生成されます。元のフィルタ条件でのフィルタ入力名は、ソース表の実際の列名をソース表の別名で修飾した名前で置換されます。
図26-8に、フィルタ演算子を使用して、選択したデータをターゲット表に移動するマッピングを示します。ORACLE_ORDERS
表には、オーダー・データが含まれています。フィルタ演算子の「フィルタ条件」プロパティを使用して、最終更新日が現在のシステム日付である記帳済オーダーのみをORDERS
表に移動しています。
マッピングのフィルタ演算子を定義する手順は、次のとおりです。
フィルタ演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
ソース属性をフィルタ演算子のI/Oグループに接続します。
フィルタ演算子のヘッダーを選択します。
プロパティ・インスペクタにフィルタ演算子のプロパティが表示されます。
「フィルタ条件」プロパティの右にある省略記号のボタンをクリックします。
フィルタ条件の「式ビルダー」ダイアログ・ボックスが表示されます。
式ビルダーを使用してフィルタ条件式を定義します。
「OK」をクリックして式ビルダーを閉じます。
フィルタ演算子の出力をターゲットのI/Oグループに接続します。
マッピング・エディタを使用すると、表、ビューまたはソース・データ演算子をそれ自体に対して再帰的に結合できます。
ツリー・ウォーキングとも呼ばれ、表をそれ自体に戻し再帰的に結合することにより、階層のレコードを取得できます。たとえば、従業員データが含まれる表があり、その従業員データには各従業員の管理者が含まれていると想定します。ツリー・ウォーキングを使用すると、特定の管理者に報告する従業員の階層を決定できます。
ツリー・ウォーキングを実行する手順は、次のとおりです。
マッピングを作成し、表、ビューまたはマテリアライズド・ビュー演算子など、階層定義が含まれている目的のソース・データ演算子を追加します。
ソース・データ演算子をフィルタ演算子に接続します。
フィルタ演算子に、最初の2語にCONNECT BYを使用してフィルタ条件を定義します。フィルタ演算子にはCONNECT BY論理のみを含めることに注意してください。つまり、フィルタにANDまたはOR論理を含めないでください。
ジョイナ演算子は、異なるカーディナリティを持つ様々なソースの複数の行セットを結合し、単一の行セットの出力を生成します。
一般的に、ジョイナ演算子はSQLのJOIN
句に対応します。SQLの結合の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
ジョイナ演算子は、各ソース行セットの列値を他の1つ以上の行セットに関連付ける、結合条件と呼ばれるブール条件を使用します。ジョイナ演算子により、生成されたSQL問合せにWHERE
句が挿入されます。Oracle9i以上で実行された場合、ANSI完全外部結合がサポートされています。
ジョイナ演算子は、内部結合、外部結合、等価結合および非等価結合に使用できます。また、「マッピングの自己結合の追加」で説明するように、フィルタ演算子を使用して自己結合を作成することもできます。
「結合条件」で説明するように、すべてのジョイナに対して結合条件を設定する必要があります。
外部結合を定義するジョイナの場合、外部結合タイプを指定する方法は2つあります。
「結合条件」で説明するように、結合条件にOracle SQL外部結合演算子(+)を挿入します。
「入力ロールと内部および外部結合の結合」で説明するように、入力グループにジョイナ入力ロールを設定します。
注意:
|
ジョイナの「結合条件」プロパティにより、ジョイナの生成されたコードでの結合条件が決定されます。外部結合演算子(+)を挿入することにより、結合条件を使用して内部結合、左外部結合、右外部結合または完全外部結合を作成することも可能です。
結合条件の関係演算子は、等号に限られません。>、<、!=、>=、<=などの他の演算子も使用できます。結合条件では集計関数はサポートされていません。
入力行セットが外部キーを介して関連付けられている場合は、その関係を使用してデフォルトの結合条件を形成できます。
注意: 結合条件を編集する前にジョイナ演算子の入力グループにソースをマッピングした場合、Oracle Warehouse Builderでは、デフォルトの結合条件のみを作成できます。 |
このデフォルト条件を使用するか、またはさらに変更できます。ソースが外部キーを介して関連付けられていない場合は、結合条件を手動で定義する必要があります。
デフォルトの外部キーにより重複するWHERE句が生成される場合は、ジョイナ演算子により、デフォルトの結合条件を作成する際に、重複する句が削除されます。これは、結合条件で複数の外部キーを参照している場合に発生することがあります。たとえば、表T1の外部キーFK1が表T2の一意キーUK1を指し、表T2の外部キーFK2が表T1の一意キーUK2を指している場合、結合条件は次のようになります。
T1.A = T2.A AND T1.B = T2.B /*All instances of FK1 -> UK1 are reduced to one WHERE clause*/ AND T2.B = T1.B AND T2.C = T1.C /*All instances of FK2 -> UK2 are reduced to one WHERE clause */
この場合、ジョイナ演算子により次の結合条件が生成されます。
T2.A = T2.A AND T1.B = T2.B AND T2.C = T1.C
Oracle SQLを使用する結合条件では、外部結合演算子(+)を使用して生成されたSQLに外部結合を作成できます。
注意: 結合入力ロールは、ジョイナ内での外部結合の動作を制御する際に、外部結合演算子のかわりに使用することが可能で、複数の入力グループを持つ複雑な結合式で外部結合演算子を使用するよりも、維持しやすい場合があります。詳細は、「入力ロールと内部および外部結合の結合」を参照してください。 |
次に例を示します。
SELECT ... FROM A, B WHERE A.key = B.key (+);
この例では、左外部結合が作成されます。
ターゲットがOracle9i以降をベースとしている場合、ジョイナ演算子では結合条件を使用した完全外部結合もサポートされます。完全外部結合条件を指定するには、関係演算子の両側に外部結合演算子を付ける必要があります。次に例を示します。
T1.A (+) = T2.B (+)
この結合式によって次のコードが生成されます。
SELECT ... FROM T1 FULL OUTER JOIN T2 ON (T1.A = T2.B);
注意: Oracle Warehouse Builderでは条件述語の両側に"(+)"記号を使用することによって指定される完全外部結合を使用できますが、この構造は、Oracle SQL構文では無効です。したがって、このような結合条件は、コードの生成時にOracle Warehouse BuilderによってANSI SQL構文に変換されます。 |
結合条件から完全外部結合を作成する際、次の点に注意してください。
ANSI結合構文が生成されるのは、ジョイナに完全外部結合条件を指定した場合のみです。それ以外の場合は、Oracle SQLの次の結合構文が生成されます。
SELECT ... FROM T1, T2 WHERE T1.A = T2.B;
完全外部結合条件と結合条件の両方を同じジョイナで指定できます。ただし、同じソースに対して両方の条件を指定した場合、コード生成には限定的な方の結合タイプが使用されます。たとえば、次のように指定するとします。
T1.A(+) = T2.A(+) and T1.B = T2.B
T1.B = T2.B
はT1とT2の間の完全外部結合条件よりも限定的であるため、Oracle Warehouse Builderでは完全外部結合のかわりに内部結合文が生成されます。
完全外部結合条件と部分外部結合条件を同じジョイナで指定することはできません。完全外部結合を指定する場合、その結合条件の他の部分では部分外部結合を指定できません。たとえば、T1.A (+) = T2.A (+) and T2.B = T3.B (+)
は無効です。
Oracle8iで完全外部結合を作成するには、複数のSQL文を使用する必要があります。
「式ビルダー」では、完全外部結合に次の構文を使用できます。
TABLE1.COL1 (+) = TABLE2.COL2 (+)
コード・ジェネレータでは、前述の式が次のようなANSI SQL 1999の完全外部結合文に変換されます。
SELECT ... FROM table1 FULL OUTER JOIN table2 ON (table1.col1 = table2.col2)
この構文は、Oracle8iではサポートされません。Oracle8iデータベースに対して完全外部結合を指定すると、妥当性エラーになります。
Oracle Warehouse Builder 10.2ではANSI構文を使用して完全外部結合を変換しますが、Oracle Warehouse Builder 11.2では条件句を省略してクロス結合を作成し、次の検証エラー・メッセージを出力します。
VLD - 1526: 演算子{0}の結合条件の述語に"(+)"付きで異なる表の2つの列が含まれます。これは、ANSI SQL構文の使用時にのみサポートされます。「ANSI SQL構文」の構成が「FALSE」に設定されている場合、述語は1つの外部結合表のみを参照します。結合条件を変更するか、「ANSI SQL構文」を「True」に設定してください。
複数の条件が含まれる3つ以上の表の結合を作成する場合、どの条件をグループ化するか明確に示す必要があります。
複数の条件が含まれる結合を定義する際、次のガイドラインに従ってください。
結合条件で句を強制的に1つの条件に組み合せるには、丸括弧を使用します。
たとえば、結合条件が次のように指定されているとします。
A.ID = B.ID AND (B.ID (+) = C.ID (+) AND B.ID > 10)
Oracle Warehouse Builderによって次のコードが生成されます(この例ではANSIコード生成が指定されていると想定します)。
SELECT ... FROM "A" "A" JOIN "B" "B" ON ( ( "A"."ID" = "B"."ID" ) ) FULL OUTER JOIN "C" "C" ON ( "B"."ID" = "C"."ID" ) WHERE ( "B"."ID" > 10 )
最後の句のB.ID (+) > 10
は、どの結合条件にも含まれず、WHERE句として扱われます。
次のように、丸括弧を使用して句をグループ化したとします。
A.ID = B.ID AND (B.ID (+) = C.ID (+) AND B.ID > 10)
Oracle Warehouse Builderにより次のコードが生成されます。
SELECT ... FROM "A" "A" JOIN "B" "B" ON ( ( "A"."ID" = "B"."ID" ) ) FULL OUTER JOIN "C" "C" ON ( ( "B"."ID" = "C"."ID" and "B"."ID" > 10 )/* OPERATOR JOINER JOIN CONDITION */ )
句B.ID (+) > 10
がFULL OUTER JOIN
条件に含まれます。
外部結合条件記号(+)を使用してWarehouse Builderが結合内で条件を生成するよう強制できます。
たとえば、次の結合条件があったとします。
A.ID = B.ID AND B.ID (+) = C.ID (+) AND B.ID (+) > 10
句B.ID (+) > 10
に外部結合演算子が存在するため、Oracle Warehouse Builderは別のWHERE句を生成するかわりに、結合内に条件B.ID > 10
を含めるよう強制されます。
注意: このように(+)演算子を使用した強制的なグループ化は、Oracle Warehouse Builderのコード生成に固有の動作で、標準Oracle SQLでの同じ式とは同じ結果が得られない場合があります。 |
次のコードが生成されます。
SELECT ... FROM "A" "A" JOIN ( SELECT /* B.INOUTGRP1 */ "B"."ID" "ID", "B"."NAME" "NAME", "B"."ATTR" "ATTR" FROM "B" "B" ) "B" ON ( ( ( "A"."ID" = "B"."ID" ) ) AND ( ( "B"."ID" > 10 ) ) ) FULL OUTER JOIN "C" "C" ON ( "B"."ID" = "C"."ID" )
この場合、丸括弧が使用されていないため、条件B.ID (+) > 10は最初のON句に移動されています。
注意: ジョイナ演算子が含まれるマッピング用にANSI SQLコード生成を構成する場合、条件が予期したとおりにグループ化されているか、生成されたコードを確認することをお薦めします。曖昧な条件により、生成されたコードでの条件のグループ化が意図したものと異なる場合があります。次のいずれかの方法を使用して結合条件を強制的にグループ化できます。
|
コード・テンプレートのマッピングで、前述のガイドラインに従っていない場合、妥当性チェックで警告が表示され、次のいずれかのアクションが実行されます。
最後に記された条件が隣接する条件と組み合せられない場合、最後の条件はWHERE句に移動されます。
C.ENAME = A.ENAME AND A.DEPTNO = B.DEPTNO AND C.SAL (+) > 1000という条件を例にとります。条件C.SAL (+) > 1000はC.ENAME = A.ENAMEと組み合せられます。ただし、条件の位置とこの組合せには一貫性がないため、妥当性の警告が表示されます。
最後に記された条件が隣接する条件と組み合せられる場合、組み合せられたグループ条件が形成されます。
A.DEPTNO = B.DEPTNO AND C.ENAME = A.ENAME AND C.SAL (+) > 1000という条件を例にとります。条件C.SAL (+) > 1000はC.ENAME = A.ENAMEと組み合せられます。したがって、組み合せられた条件C.ENAME = A.ENAME AND C.SAL (+) > 1000の一部に含められます。
デフォルトで、ジョイナ内の入力グループの順序が結合順序として使用されます。
ANSI SQL構文を生成する際、結合条件で特定の順序を使用することにより、異なる結合順序を強制できます。次に例を示します。
SELECT ... FROM T1 FULL OUTER JOIN T2 ON (T1.A=T2.A) JOIN T3 ON (T2.A=T3.A);
T1、T3、T2のように、入力グループを別の順序で作成する場合を考えます。Oracle Warehouse Builderにより次のコードが生成されます。
SELECT ... FROM T1 JOIN T3 ON (1=1) JOIN T2 ON (T1.A=T2.A and T2.A=T3.A);
T1とT3の結合時には、結合条件は指定されません。Oracle Warehouse Builderにより条件1=1(特にブールのtrue)が入力され、指定した2つの条件を使用して(T1 JOIN T3)とT2が結合されます。
ここで、入力グループがT1、T3、T2の順序で作成されるが、生成されるFROM句の順序を最初の例のようにT1、T2、T3とする場合の例を考えます。この場合、生成されるコードに出現する順序でソースを記述するため、次のような結合条件を作成します。
T1.A(+) = T2.A(+) AND T2.A = T3.A
フィルタ条件は結合後に適用されます。たとえば、次の結合を考えてみます。
Input1.c --- + Input2.c --- +---> Joiner Input3.c --- +
この結合に次の条件が適用されるとします。
条件1: Input1.c (+) = Input2.c (+)
条件2: Input2.c = Input3.c
条件3: Input1.c is not null
最初の2つの条件はtrue結合ですが、第3の条件はフィルタ条件です。ANSIコードを生成する場合、結合条件が次のように解析されます。
SELECT ... FROM Input1 FULL OUTER JOIN Input2 ON (Input1.c = Input2.c) JOIN Input3 ON (Input2.c = Input3.c) WHERE Input1.c IS NOT NULL;
ジョイナ入力グループの結合入力ロールを使用すると、入力データ・フローに対する内部結合および外部結合の使用を柔軟に制御できます。
入力グループに使用できる結合入力ロールは、標準(デフォルト)、外部結合および完全外部結合です。Oracle Warehouse Builderでは、これらの設定に基づいて、内部結合、左および右外部結合、および完全外部結合でANSI SQLまたはOracle SQLを生成できます。作成する結合の種類を指定するために、各入力グループに対して入力グループの順序および入力ロール設定を使用します。
注意: 外部結合を制御するために結合式で外部結合演算子を使用する場合、すべてのグループの結合入力ロールを標準に設定します。 |
2つの隣接する入力グループを考慮する際、生成されるコードでのこれらのグループ間の関係は、2つのグループの結合ロールのプロパティ設定によって決定されます。入力グループINGRP1がソース表T1に接続され、入力グループINGRP2がソース表T2に接続されているとします。結合関係は、次のルールに従って決定されます(優先順)。
3つ以上の入力グループがある場合、Oracle Warehouse Builderは入力グループを反復し、入力表をリンクする一連の結合を生成します。
いずれかの入力グループの入力ロールが標準または完全外部結合である場合、生成される結合は表26-1「結合入力ロールおよび結果の結合タイプ」で説明されているルールを使用して決定されます。
ただし、2つの連続する入力グループが両方とも入力ロールが外部結合である場合、生成される結合は、前に生成された結合により、左外部結合または右外部結合である可能性があります。生成される結合タイプを決定するルールを、表26-2「連続する外部結合入力ロールで生成される結合」に示します。この表で、INGRP1、INGRP2およびINGRP3はそれぞれ表T1、T2およびT3に関連付けられていると想定します。
表26-2 連続する外部結合入力ロールで生成される結合
入力ロール | 結果の結合操作 |
---|---|
2つの入力グループが最初の2つの入力グループ INGRP1 = 外部 INGRP2 = 外部 |
右外部結合 T1 RIGHT OUTER JOIN T2 |
生成された直前の結合が左外部結合 INGRP1 = 標準 INGRP2 = 外部 INGRP3 = 外部 |
左外部結合 T1 LEFT OUTER JOIN T2 LEFT OUTER JOIN T3 |
生成された直前の結合が左外部結合ではない INGRP1 = 外部 INGRP2 = 外部 INGRP3 = 外部 |
右外部結合 T1 RIGHT OUTER JOIN T2 RIGHT OUTER JOIN T3 |
ジョイナ演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
3つ以上のソースを結合する必要がある場合、ジョイナ演算子を右クリックして「詳細を開く」を選択します。
ジョイナ・エディタが表示されます。
「グループ」タブで、必要に応じてさらに入力グループを作成します。
入力グループを作成するには、「グループ」列の下の空のセルをクリックして新しいグループ名を入力します。新しいグループに割り当てられているデフォルトの方向はInput
です。
入力グループの追加後、「OK」をクリックします。
各入力グループについて、ソースの出力グループを必要なジョイナの入力グループに接続します。
出力属性が、対応する入力のデータ型と一致するデータ型を使用して作成されます。
必要に応じて、各ソースの入力ロールを変更します。
「入力ロールと内部および外部結合の結合」を参照してください。
ジョイナ演算子のヘッダーを選択します。
プロパティ・インスペクタにジョイナ演算子のプロパティが表示されます。
結合条件プロパティの右にある省略記号のボタンをクリックします。
「式ビルダー」ダイアログ・ボックスが表示されます。
結合条件を定義します。
「結合条件」を参照してください。
「OK」をクリックして式ビルダーを閉じます。
ジョイナ演算子の出力グループの属性をターゲットにマップします。
例: ジョイナ演算子の使用
図26-9に、ジョイナ演算子を使用するマッピングを示します。2つのソース表ORACLE_ORDERS
およびORACLE_ORDER_LINES
が結合され、この2つの表のデータが結合されて1つの表となっています。ジョイナ演算子の出力は、ターゲット表DAILY_ORDERS
に渡されます。
LCRキャスト演算子を使用して、LCR(論理変更レコード)オブジェクトを構成する列に拡張します。これにより、LCRに含まれた挿入、更新または削除操作を使用して、ターゲット・オブジェクトを更新できます。通常、LCRキャスト演算子は、ソースの変更をターゲット・オブジェクトに公開するリアルタイム・マッピングで、キュー演算子の直後に使用されます。
LCRキャスト演算子は、そのLCRキャスト演算子に変更レコードが格納されている表とバインドする必要があります。LCRキャスト演算子には、1つの入力グループと1つの出力グループがあり、この両グループは編集できません。この演算子にグループを追加することはできませんが、既存の入力または出力グループの名前を変更できます。入力グループには、SYS.LCR $_ROW_RECORDタイプの属性Eventが含まれ、ここにLCRが格納されます。SYS.ANYDATA
属性を入力グループと接続する必要があります。出力グループには、LCRキャスト演算子のバインド先の表の列が含まれます。
LCRキャスト演算子をマッピングに追加する手順は、次のとおりです。
LCRキャスト演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
「LCRキャストの追加」ダイアログ・ボックスが表示されます。
LCRキャスト演算子をバインドする表を選択します。
ソース演算子の出力属性をLCRキャスト演算子の入力グループに接続します。
LCRキャスト演算子の出力グループの属性を、LCRに格納された変更を公開するターゲット表に接続します。
図26-10は、マッピングでのLCRキャスト演算子の使用例を示しています。キュー演算子ADVANCED_QUEUEは、ソース表の変更レコードを格納するアドバンスト・キューを表します。LCRキャスト演算子は、ソース表からの変更レコードの転送先の表にバインドされています。
AQには、PAYLOAD属性で表されるペイロードが含まれています。ペイロードには、変更データがLCRの形で格納されます。PAYLOAD属性をLCRキャスト演算子にマッピングし、LCRキャスト演算子にバインドされているターゲット表に含まれた列にLCRを展開します。その後、LCRキャスト演算子の出力属性をターゲット表ORDERS
にマップします。
LCRスプリッタ演算子を使用して、データ・フローのパスに沿って変更を異なる表に送ります。
LCRスプリッタには入力グループ1つと出力グループ1つが含まれます。両方のグループに、タイプSYS.LCR$_ROW_RECORDのEventという1つの属性が含まれます。入力グループはLCRオブジェクトを表します。入力または出力グループは追加できません。
参照演算子を使用して、表、ビュー、キューブまたはディメンションのデータを検索します。たとえば、参照演算子を使用するのは、キューブをロードするマッピングを定義する場合や、ディメンションのサロゲート・キーを定義する場合などです。
同じ参照演算子を使用して複数のオブジェクトのデータを検索できます。
関連項目: サロゲート識別子の詳細は、『Oracle Warehouse Builder概要』を参照してください。 |
検索するキーには、任意の一意な値を使用できます。RDBMSで定義されているように主キーまたは一意キーである必要はありません。参照演算子は、指定されたキー入力を使用して検索表からデータを読み取り、一致する行を正確に1つ戻します。この演算子は、入力キーごとに1行を戻します。同じマッピングに複数の参照演算子を使用できます。
参照演算子の出力は、検索オブジェクトの列に対応します。参照操作によって複数のレコードが戻される場合、それらのレコードのうちのどれを選択するかを指定できます。
参照ウィザードには入力グループ1つと出力グループ1つが含まれます。追加の入力および出力グループを作成できます。各入力グループの属性は、同じデータ・ソースから接続されている必要があります。各出力グループは、1つの検索オブジェクトにバインドされます。各参照は、検索値として、1つの入力グループのみの属性を使用します。つまり、各出力グループは、1つの入力グループのみに関連付けられています。各出力グループのツールチップに、関連付けられている入力グループと、使用される検索条件が表示されます。
出力グループはオブジェクトにバインドされているため、属性はオブジェクト内の列です。出力属性の「式」プロパティを使用して、オブジェクト列から導出される追加の出力属性を作成できます。
参照の各出力属性には、DEFAULT VALUEというプロパティがあります。DEFAULT VALUEプロパティは、入力値の参照表で値が検出されない場合に送信行セットでNULLのかわりに使用されます。生成済コードでは、NVLファンクションが使用されます。参照の結果は、常に外部結合文となります。
データの検索元となる表、ビューまたはディメンションは、参照演算子にバインドされます。参照演算子を、バインド先のワークスペース・オブジェクトと同期化できます。ただし、ワークスペース・オブジェクトを参照演算子と同期化することはできません。演算子の同期化の詳細は、「演算子およびワークスペース・オブジェクトの同期化」を参照してください。
参照演算子の使用時の注意点
参照演算子は1行しか戻しません。参照の結果が複数行を戻す場合、戻り値としてどの行を使用するかを指定する必要があります。戻される行の最初の行または最後の行のいずれかを選択できます。
最初または最後の行を選択するため、参照結果が戻される順序が重要になります。SQL問合せでは順序が必ずしも反復可能ではないため、参照結果をソートするために適切なORDER BY句を指定する必要があります。決定できない状況にならないよう、目的のレコードが検索結果として確実に選択されるような、詳細な順序の句を指定する必要があります。
図26-11に、キューブのロードに使用されるマッピングを示します。4つのソース表のデータはジョイナ演算子を使用して結合されます。ただし、ソース表のデータに含まれているのはチャネル名のみです。このキューブをロードするには、サロゲート識別子の値が必要です。参照演算子を使用してCHANNELS
ディメンションのサロゲート識別子を検索し、この値をキューブにロードします。
参照演算子の使用には、次のオプションが用意されています。
新しい参照演算子の定義: 参照演算子をパレットからマッピングにドラッグします。マッピング・エディタにウィザードが表示されます。
既存の参照演算子の編集: 参照演算子を右クリックして「詳細を開く」を選択します。
演算子ウィザードと演算子エディタのどちらを使用する場合も、次のページを完了します。
名前ページまたは「名前」タブを使用して、参照演算子の名前と説明(オプション)を指定します。
グループ・ページを使用して、入力グループと出力グループをそれぞれ1つ指定します。
参照演算子の場合、入力グループは複数の属性に含まれるソースのデータを表します。出力グループは行に変換されたデータを表します。
デフォルトの入力グループと出力グループの名前を変更したり、説明を追加できます。また、必要に応じて追加の入力および出力グループを作成できます。入力または出力グループを作成するには、グループの名前を指定し、方向(入力または出力)を選択し、説明(オプション)を追加します。
すべての出力グループは検索表に関連付けられます。検索表ページまたは「検索表」タブを使用して、各出力グループに関連付ける検索表を選択します。
「グループ」フィールドには、参照演算子に対して定義されているすべての出力グループが表示されます。出力グループを選択し、出力グループのバインド先の検索表を指定します。検索表を選択するには、「グループ」フィールドの下のリストをクリックします。検索が実行可能なオブジェクトがツリーに表示されます。検索オブジェクトを選択します。
参照演算子のすべての出力グループについて、この手順を繰り返します。
入力属性ページを使用して、各入力グループの入力属性を定義します。
「グループ」フィールドには、参照演算子に対して定義されているすべての入力グループが表示されます。入力グループを選択し、そのグループの属性を作成します。各入力属性には、「デフォルト値」というフィールドが含まれます。このフィールドを使用して、入力属性のデフォルト値を指定します。
「出力属性」フィールドを使用して、各出力グループの出力属性を作成します。それぞれの出力グループは検索オブジェクトにバインドされているため、バインドされた検索オブジェクトの列が自動的にグループの出力属性として表示されます。必要な追加の出力属性を作成します。これらには、式を使用して既存の属性から導出される値を使用できます。
「グループ」リストには、参照演算子に対して定義されている出力グループが表示されます。出力グループを選択すると、そのグループの属性が表示されます。出力属性を作成するには、「名前」フィールドの空のセルをクリックして属性名を入力します。その後、データ型、デフォルト値、説明など、属性の追加パラメータを指定します。
出力属性には、「式」という追加パラメータがあります。この列を使用して、出力属性の値を決定するために使用される式を指定します。「式」列に式を直接入力できます。または、「式」列の右側にある省略記号ボタンをクリックして式ビルダー・インタフェースを表示します。このインタフェースを使用して式を定義します。
検索ページを使用して、検索の実行対象となるオブジェクトの詳細を入力します。このオブジェクトは、検索結果と呼ばれます。現行のプロジェクトに属する任意の表、ビューまたはディメンションについて検索を実行できます。
検索ページで、出力グループを対応する入力グループに関連付けることもできます。各出力グループは、1つの入力グループにバインドされている必要があります。入力グループにより、出力グループが示す検索表で検索する値が提供されます。
「出力」フィールドには参照演算子の出力グループが示され、「入力」フィールドには入力グループが示されます。出力グループを選択し、「入力」リストからバインド先の入力グループを選択します。すべての出力グループについて、この手順を繰り返します。
出力グループが対応する入力グループに倍土された後、検索を実行するために比較する必要のある出力属性と入力属性をマッピングする必要があります。「出力」フィールドで出力グループを選択し、ページの一番下の領域を使用して検索条件を指定します。この領域に表示される内容は、簡易編集かフリースタイル編集のいずれを選択したかによって異なります。
簡易編集を選択した場合、2つの列を持つ表が表示されます。「検索表の列」を使用して、「入力属性」列で選択した属性の比較対象となる検索表の列を選択します。
フリースタイル編集を選択した場合、式ビルダーと同様のインタフェースが表示されます。これを使用して、検索条件として使用される条件を定義します。検索条件には、等価または不等価条件を使用できます。
検索用のディメンション・レベルを選択すると、オプションとしてディメンション・レベルのサロゲートIDとビジネスID、およびディメンション・データを格納するデータベース表の主キーが表示されます。
複数の一致行ページを使用して、検索によって複数の行が戻された場合に、検索結果のどの行を検索結果として選択するかを定義します。指定された検索条件が複数のレコードに一致した場合、複数の行が戻されます。
各出力グループについて、検索操作によって複数の行が戻された場合のアクションを定義する必要があります。
「出力グループ」フィールドで出力グループを選択し、次の各項で説明するように、このグループの値を指定します。
複数の行が戻された場合に実行するアクションの選択
次のいずれかのオプションを選択します。
エラー: 複数行により、マッピングが失敗します。
このオプションを選択すると、この参照演算子が含まれるマッピングを実行した場合、選択した出力グループの検索操作で複数の行が戻されると、マッピングの実行が失敗します。
すべての行(結果行の数が入力行の数と異なる可能性があります)
このオプションを選択すると、選択した出力グループについて参照演算子によって複数の行が戻された場合、検索結果としてすべての行を戻します。
単一行の選択
このオプションを選択すると、選択した出力グループについて参照演算子によって複数の行が戻された場合、戻された行の中から1行のみを検索結果として選択する必要があります。このオプションを選択した場合、このオプションの下にあるセクションのフィールドが有効になります。これらのフィールドを使用して、検索結果セットからどの行を検索結果として選択するかを指定します。
検索結果として選択する行の指定
前のセクションで「単一行の選択」オプションを選択した場合のみ、検索操作によって生成された複数行から選択する1行を選択する必要があります。
各出力グループについて、検索操作によって戻された複数の行から選択する必要のある行に関し、次の情報を指定します。
行の位置: 次のオプションから1つを選択します。
任意の行
参照演算子によって戻された結果セットから、任意の1行が検索結果として選択されます。
最初の行
参照演算子によって戻された結果セットから、最初の行が検索結果として選択されます。
最後の行
参照演算子によって戻された結果セットから、最初の行が検索結果として選択されます。
n番目の行
参照演算子によって戻された結果セットから、n番目の行が検索結果として選択されます。「n番目の行」フィールドのリストをクリックして、nの値を指定します。
結果セットの順序
このセクションを使用して、結果セット(複数行が含まれる)の行の順序を決定する方法を指定します。検索結果として結果セットから最初、最後、または n番目の行を選択する場合、列の順序が重要になります。目的の行が選択されるよう、順序を決定する条件を正しく指定します。
「使用可能」セクションには、「出力グループ」フィールドで選択した出力グループの検索表の列が表示されます。検索結果セットの行の順序を決定するために使用する列を選択し、矢印を使用して「選択済」セクションに移動します。「選択済」セクションで、結果セットの順序と同じ順序で(上から下に)列が表示されていることを確認します。たとえば、ORDER BY attr2、attr3、attr1のように順序付けを実行する場合、属性は「選択済」セクションと同じ順序でリストされている必要があります。「選択済」セクションの右の矢印を使用して、選択した列の位置を変更できます。
一致行なしページを使用して、検索ページで指定した検索条件を満たす行がない場合に実行するアクションを指定します。すべての出力グループに対して、アクションを指定する必要があります。
「出力グループ」フィールドで出力グループを選択し、次のいずれかのオプションを選択します。
行が戻りません。
このオプションでは、検索結果に一致条件を満たす行がない場合、行を戻しません。
行を次のデフォルト値とともに戻します
このオプションを使用すると、検索結果が検索条件を満たさない場合に、デフォルト値を含む行を戻すことができます。このオプションの下にある表を使用して、検索列ごとにデフォルト値を指定します。
このページを使用するのは、検索ページで検索結果としてタイプ2のSCDを選択した場合のみです。検索結果がタイプ2のSCDの場合、検索として使用する特定のレコードのバージョンを指定する必要があります。
タイプ2のSCDにバインドした各出力グループに対して、「出力グループ」フィールドでグループを選択し、次のいずれかのオプションを選択します。
最新のレコードを使用します。
このオプションでは、検索条件を使用した検索の対象となる属性に対応する現行のレコードが戻されます。現行のレコードとは、最新のタイムスタンプが付いたレコードです。
過去日付を定数として指定します
このオプションでは、「日付」および「時間」リストで指定した定数値を含むレコードが戻されます。
過去日付を持つ入力属性を選択します。
このオプションを選択すると、入力属性の1つに含まれる日時に関連するレコードを戻すことができます。「入力属性」リストを使用して、過去の値を含む属性を選択します。
ピボット演算子を使用すると、1行の属性を複数行に変換できます。
この演算子は、複数の行ではなく属性に含まれるデータを変換する場合にマッピングで使用します。このような状況は、クロス集計形式のデータなど、非リレーショナル・データソースからデータを抽出する際に生じることがあります。
外部表SALES_DAT
には、フラット・ファイルのデータが格納されています。この表は、行単位に営業担当、列単位に月を指定して作成されています。
関連項目: 外部表の詳細は、『Oracle Warehouse Builderソースおよびターゲット・ガイド』を参照してください。 |
図26-12に、フラット・ファイルSALES_DAT
を示します。
表26-3は、ピボット操作が実行された後のデータのサンプルを示しています。それまで複数の列(M1、M2、M3...)に含まれていたデータは、1つの属性(Monthly_Sales)に含まれています。SALES_DAT
内の1つのID行は、ピボット後のデータの12行に対応します。
表26-3 ピボット後のデータ
REP | MONTH | MONTHLY_SALES | REGION |
---|---|---|---|
0675 |
Jan |
10.5 |
4 |
0675 |
Feb |
11.4 |
4 |
0675 |
Mar |
9.5 |
4 |
0675 |
Apr |
8.7 |
4 |
0675 |
May |
7.4 |
4 |
0675 |
Jun |
7.5 |
4 |
0675 |
Jul |
7.8 |
4 |
0675 |
Aug |
9.7 |
4 |
0675 |
Sep |
NULL |
4 |
0675 |
Oct |
NULL |
4 |
0675 |
Nov |
NULL |
4 |
0675 |
Dec |
NULL |
4 |
この例のピボット変換を実行するには、図26-13に示すようなマッピングを作成します。
ピボット変換を実行するこのマッピングの場合、データは外部表から一度読み取られ、ピボットおよび集計され、セット・ベース・モードでターゲットに書き込まれます。ピボット後にデータをターゲットに直接ロードする必要はありません。データをターゲット演算子に送る前後に、一連の演算子でピボット演算子を使用できます。フィルタ、ジョイナおよび集合演算などの演算子をピボット演算子の前に配置できます。ピボットされたデータは行単位の操作ではないため、マッピングをセット・ベース・モードで実行することも可能です。
ピボット演算子では、行ロケータはソースからの反復データ・セットに対応するように作成する出力属性です。ピボット演算子を使用すると、1つの入力属性が複数行に変換され、行ロケータの値が生成されます。次の例では、ソースに各月の属性が含まれているため、MONTH
という出力属性を作成し、この属性を行ロケータとして指定できます。SALES_DAT
の行ごとに、12行のピボット・データが出力されます。
表26-4には、行インジケータとしてMONTH
を使用してデータがピボットされた後のSALES_DAT
の1行目のデータを示します。
ピボット演算子の使用には、次のオプションが用意されています。
新しいピボット演算子の定義: ピボット・ウィザードを使用して、マッピングに新しいピボット演算子を追加します。ピボット演算子をパレットからマッピングにドラッグします。マッピング・エディタにピボット・ウィザードが表示されます。
既存のピボット演算子の編集: ピボット・エディタを使用して、前に作成したピボット演算子を編集します。演算子を右クリックして「詳細を開く」を選択します。マッピング・エディタのピボット・エディタが開きます。
ピボット・ウィザードとピボット・エディタのどちらを使用する場合も、次のページを完了します。
一般ページを使用して、ピボット演算子の名前と説明(オプション)を指定します。デフォルトでは、ウィザードにより演算子名「Pivot」が指定されます。
グループ・ページを使用して、入力グループと出力グループをそれぞれ1つ指定します。
ピボット演算子の場合、入力グループは複数の属性に含まれるソースのデータを表します。出力グループは行に変換されたデータを表します。
入力グループと出力グループの名前を変更したり、説明を追加できます。各ピボット演算子の入力グループと出力グループはそれぞれ1つのみである必要があるため、ウィザードでグループの追加や削除またはグループの方向の変更はできません。
接続の入力ページを使用して、属性をピボット演算子にコピーおよびマッピングします。選択する属性は、ピボット入力グループにマッピングされます。ページの左側には、マッピングの全演算子のリストが表示されます。
図26-14は、ピボット演算子の入力として選択された外部表SALES_DAT
のグループを示します。
ピボット演算子の接続の入力ページを完了する手順は、次のとおりです。
左側のパネルで、グループ全体または個別の属性を選択します。
名前で特定の属性またはグループを検索するには、「検索」にテキストを入力し、「実行」を選択します。次の一致を検索するには、「実行」を再度選択します。
複数の属性を選択するには、[Shift]キーを押しながら選択します。異なるグループの属性を選択するには、最初にジョイナ演算子または集合演算子を使用してグループを結合する必要があります。
ページ中央にある「>」ボタンを使用して、選択内容をウィザード・ページの右側に移動します。
接続の入力のリストからグループまたは属性を削除するには、「<」ボタンを使用します。Oracle Warehouse Builderでは、選択内容が入力グループから削除され、ソース演算子とピボット演算子間のデータ・フロー接続も削除されます。
図26-15は、SALES_DAT
のグループがPIVOTSALES
にコピーおよびマッピングされた様子を示します。
入力属性ページで、「接続の入力」タブまたはウィザード・ページで選択した属性を変更します。
入力属性ページでは、次のタスクを実行できます。
属性の追加: このページの空白行に属性名やその他の属性の詳細を入力します。
属性のプロパティの変更: 属性名、データ型、長さ、精度およびスケールを変更できます。
説明(オプション)の追加: 入力属性の説明を入力します。
属性キーの指定: オプションとして、「キー」チェック・ボックスを使用し、入力グループを一意に識別する属性を指定します。
出力属性ページを使用して、ピボット演算子の出力属性を作成します。「入力属性」タブまたはウィザード・ページで入力属性をキーとして指定した場合、これらの入力属性は、編集も削除もできない出力属性として表示されます。
図26-16には、MONTH
が行ロケータとして選択された出力属性を示します。
ピボットの出力属性ページでは、次のタスクを実行できます。
属性のプロパティの変更: 前のタブまたはウィザード・ページでキーとして指定した属性を除いて、属性名、データ型、長さ、精度およびスケールを変更できます。
説明(オプション)の追加: 出力属性の説明を入力します。
行ロケータの指定: ピボット演算子に行ロケータを指定する必要はありませんが、指定しておくことをお薦めします。出力属性ページまたはタブで行ロケータを識別すると、出力データと入力データとの照合がより容易になります。
ピボット演算子において、行ロケータとは、ソースの繰返しデータ・セットに対応する出力属性です。たとえば、ソース・データに、各月の個別の属性が含まれる場合、出力属性「MONTH
」を作成し、それを行ロケータとして指定します。
ピボット変換ページで、各出力属性の式を記述します。
デフォルトでは2行が表示されます。「追加」を使用して、ソースの1行から出力する行数を指定します。たとえば、ソースに1年の四半期ごとの属性が含まれる場合、ソースの各行の出力には4行を指定できます。ソース・データに1年の月ごとの属性が含まれる場合は、ソースの各行の出力には12行を指定できます。
図26-17に、各月の属性を使用してソースに定義されたピボット式とともに「ピボット変換」タブを示します。
ピボット式の記述は、次の出力タイプに基づきます。
行ロケータ: 各行の名前を指定します。この名前は表にロードする値です。たとえば、行ロケータが「MONTH」の場合、最初の行には「Jan」と入力します。
ピボットされた出力データ: リスト・ボックスから該当する式を選択します。たとえば、「Jan」として定義した行では、1月の値のセットを戻す式を選択します。
すでにキーとして指定された属性: 式が自動的に定義されます。
不要なデータ: ピボット変換ページに出力としては不要なデータが含まれる場合、「NULL」式を使用します。Oracle Warehouse Builderでは、NULLとして定義された属性に対して、データのない繰返し行セットが出力されます。
ウィザードを使用してピボット演算子を作成する場合は、ウィザードを閉じるときに「終了」をクリックします。マッピング・エディタに、定義された演算子が表示されます。
ピボット・エディタを使用して既存のピボット演算子を編集する場合は、演算子の編集が終わったときに、「OK」をクリックします。マッピング・エディタで演算子が更新され、変更内容が反映されます。
マッピング後プロセス演算子を使用して、PL/SQLマッピングの実行後に実行されるプロシージャを定義します。たとえば、マッピング後プロセス演算子を使用すると、マッピングが正常に完了してデータがターゲットにロードされた後で、索引を再び有効化して作成できます。
マッピング後プロセス演算子は、ファンクションまたはプロシージャをマッピングの実行後にコールします。出力パラメータ・グループは、戻り値(ファンクションを介して実装済の場合)の接続ポイントと、ファンクションまたはプロシージャの出力パラメータを提供します。これらの出力属性の接続に制限はありません。
マッピング後プロセス演算子には、選択したPL/SQLプロシージャまたはファンクションに関連付けられているパラメータの数と方向に対応するグループが含まれています。グループと属性のリストを変更するには、ワークスペース内のオブジェクトと同期化する必要があります。
マッピング後プロセス演算子には、定数、データ・ジェネレータ、マッピング入力パラメータおよびマッピング前プロセスからの出力をマップできます。マッピング後プロセス演算子は、SQL*Loaderマッピングには無効です。
マッピング後プロセス演算子をマッピング・エディタに追加した後、「演算子のプロパティ」ダイアログ・ボックスを使用してプロセスの実行条件を指定します。
マッピングにマッピング後プロセス演算子を使用する手順は、次のとおりです。
マッピング後プロセス演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
Oracle Warehouse Builderの「マッピング後プロセスの追加」ダイアログ・ボックスが表示されます。
「マッピング後プロセスの追加」ダイアログ・ボックスを使用して、変換を選択または作成します。「マッピング後プロセスの追加ダイアログ・ボックスの使用方法の詳細は、「演算子を追加するための演算子の追加ダイアログ・ボックスの使用」を参照してください。
ソース演算子の出力属性をマッピング後プロセス演算子のI/Oグループに接続します。
演算子の実行条件を設定します。
マッピング後プロセス演算子の実行条件を設定する手順は、次のとおりです。
マッピング・キャンバスからマッピング後プロセス演算子を選択します。
プロパティ・インスペクタにマッピング後プロセス演算子のプロパティが表示されます。
「マッピング後プロセスの実行条件」をクリックし、次の実行条件から1つ選択します。
ALWAYS: プロセスはマッピング・エラーに関係なく実行されます。
ON SUCCESS: プロセスは、マッピングがエラーなしで完了した場合にのみ実行されます。
ON ERROR: プロセスは、マッピングの完了時にエラー数がマッピングに対して設定された許容エラー数を超えていた場合にのみ実行されます。
ON WARNING: プロセスは、マッピングの完了時にエラー数がマッピングに対して設定された許容エラー数を下回っていた場合にのみ実行されます。
「エラー発生時」または「警告時」を選択し、マッピングを行ベース・モードで実行する場合は、マッピングの「エラーの最大数」が設定されていることを確認する必要があります。許容エラー数を確認するには、プロジェクト・ナビゲータでマッピングを右クリックし、「構成」を選択して「ランタイム・パラメータ」を開きます。
マッピング前プロセス演算子を使用して、マッピングの実行前に実行されるプロシージャを定義します。
たとえば、マッピング前プロセス演算子を使用すると、表をステージング領域にロードするマッピングの実行前に、そのステージング領域にある表を切り捨てることができます。また、データをターゲットにロードするマッピングの実行前に、索引を無効化することも可能です。その後、マッピング後プロセス演算子を使用して、データをターゲットにロードするマッピングの実行後に、索引を再有効化して作成できます。
マッピング前プロセス演算子は、メタデータが定義されているファンクションまたはプロシージャをマッピングの実行前にコールします。出力属性グループは、戻り値(ファンクションとして実装済の場合)と、ファンクションまたはプロシージャの出力パラメータを提供します。これらの属性はダウンストリームにある任意の演算子に接続でき、マッピング後プロセス演算子のような接続の制限はありません。
マッピング前プロセス演算子をマッピング・エディタ・キャンバスにドロップすると、ダイアログ・ボックスが開き、使用可能なライブラリ、カテゴリ、ファンクションおよびプロシージャが表示されます。ツリーからファンクションまたはプロシージャを選択すると、演算子によって選択したファンクションまたはプロシージャに対応する属性が表示されます。
マッピング前プロセス演算子には、選択したPL/SQLプロシージャまたはファンクションの関連パラメータの数と方向に対応するグループが含まれています。
マッピング前プロセス演算子をマッピング・エディタに追加した後、プロパティ・インスペクタを使用してマッピングの実行条件を指定します。
マッピングにマッピング前プロセス演算子を使用する手順は、次のとおりです。
マッピング前プロセス演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
「マッピング前プロセスの追加」ダイアログ・ボックスが表示されます。
「マッピング前プロセスの追加」ダイアログ・ボックスを使用して、変換を選択または作成します。このダイアログ・ボックスの使用方法の詳細は、「演算子を追加するための演算子の追加ダイアログ・ボックスの使用」を参照してください。
マッピング前プロセス演算子の出力属性を、ターゲット演算子の入力グループに接続します。
演算子の実行条件を設定します。
マッピング前プロセス演算子を使用したマッピングの実行条件を設定する手順は、次のとおりです。
マッピング・キャンバスで、マッピング前プロセス演算子を選択します。
プロパティ・インスペクタにマッピング前プロセス演算子のプロパティが表示されます。
「マッピングの実行条件」をクリックし、次の実行条件から1つ選択します。
常時: エラーの有無に関係なくプロセスの完了後にマッピングが実行されます。
ON SUCCESS: プロセスがエラーなしで完了した場合にのみマッピングが実行されます。
ON ERROR: プロセスがエラーありで完了した場合にのみマッピングが実行されます。
集合演算では、2つのコンポーネントの問合せ結果が組み合されて1つの結果になります。
ジョイナは個別の行を組み合せて1行にしますが、集合演算演算子は様々な集合演算条件の中の1つを使用してすべてのデータ行を組み合せて1つの出力行セットにします。集合演算演算子の場合、データは1つの出力に追加されますが、列リストが組み合されて1つの列リストとなることはありません。
集合演算演算子を使用すると、マッピングで次の集合演算を使用できます。
デフォルトでは、集合演算演算子には入力グループ2つと出力グループ1つが含まれます。演算子エディタを使用すると、入力グループを追加できます。出力グループの属性の数は、最大数の属性を含む入力グループの属性の数と一致します。
集合演算演算子を使用するには、すべての集合の属性数が一致し、対応する属性のデータ型が一致する必要があります。対応する属性は、入力グループ内の属性の順序で判別されます。たとえば、入力グループ1の属性1は入力グループ2の属性1に対応します。
集合演算は上から下へと適用する必要があります。集合演算の実行順序は、入力グループの順序により決定されます。この順序は減算操作にのみ影響します。たとえば、AマイナスBとBマイナスAは異なります。最初の入力グループ内の属性の順序により、集合の構造が決定されます。たとえば、{empno, ename}は{ename, empno}と異なります。
マッピングで集合演算演算子を使用する手順は、次のとおりです。
集合演算演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
集合演算演算子グループにソース属性を接続します。
集合演算演算子のヘッダーを選択します。
プロパティ・インスペクタに集合演算演算子のプロパティが表示されます。
「集合演算」プロパティのリストをクリックし、リストから操作を選択します。
集合演算出力グループをターゲット入力グループに接続します。
マッピング・エディタの集合演算演算子は、2つのデータ・ストリーム間で属性を照合する際に役に立ちます。マッピングで2つのデータ・ストリームの属性を照合するには、集合演算演算子に対してデータ・ストリームを入力グループとして定義します。「入力属性」タブで、「<入力グループ名>から同期」をクリックします。同期化操作により、ターゲット・グループがソース・グループと最も近くなるよう属性が再調整されてターゲット・グループに追加されます。同期化操作では、次のルールを使用してターゲット内の一致対象が検出および作成されます。
名前とデータ型が一致するターゲット内の既存の属性を検索します。
説明がソース名と一致し、データ型がソースのデータ型と一致するターゲット内の既存の属性を検索します。
(1)と(2)が失敗した場合、ソース名とデータ型を使用して新規属性が作成され、一致する正しい位置に挿入されます。一致しないターゲット・グループ属性は、属性の説明に「UNMATCHED」
として示されます。
ターゲット属性を特定のソース属性に強制的に一致させるには、ターゲット属性の説明にソース・グループ属性を入力します。
ソーター演算子を使用すると、ソート済の行セットを生成できます。
ソーター演算子を使用すると、ソート対象の入力属性とソート順(昇順または降順)を指定できます。Oracle Warehouse Builderでは、マッピングにより生成されるコードにORDER BY句を挿入することでデータがソートされます。
ソーター演算子には、I/Oグループが1つあります。ソーター演算子を使用すると、すべてのリレーショナル・データベース・ソースのデータをソートできます。ソーター演算子の後に任意の演算子を使用できます。
ソーター演算子にはORDER BY句が含まれます。この句はI/Oグループの属性の順序付きリストであり、このI/Oグループでは、順序付き属性リストと同じ順序でソートが実行されることが指定されます。各属性について昇順または降順のソートを設定できます。
ウェアハウス内のほとんどのデータは、バッチでロードされます。ロード・ルーチンには問題が発生する場合があります。たとえば、受注バッチに1つの受注番号が複数回含まれ、各受注明細が異なる受注ステータスを表している場合があります。受注のステータスは、1日のうちに「CREATED」から「UPDATED」、「BOOKED」へと進みます。
SQL文ではデフォルトで順序付けが保証されないため、ターゲット表に対する挿入と更新が間違った順序で実行される場合があります。結果のステータスは「BOOKED」である必要がありますが、「UPDATED」行が最後に処理されると、それがその日の最後の値になります。Oracle Warehouse Builderでは、ソーター演算子を使用して順序付きの抽出問合せを作成することで、この問題を解決できます。ORDER BY句では、最後に更新される属性を使用できます。これにより、レコードは必ず作成時の順序で表示されます。
図26-18に、ソーター演算子を使用してORACLE_ORDERS
表のレコードをソートするマッピングを示します。ソーター演算子の「Order By句」プロパティを使用して、ORDER_ID
属性およびLAST_UPDATED
属性の入力レコードをソートします。
マッピングでソーター演算子を使用する手順は次のとおりです。
「ソーター」演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
ソース演算子グループをソーターI/Oグループに接続します。
ソーター演算子のヘッダーを選択します。
プロパティ・インスペクタに演算子のプロパティが表示されます。
「Order By句」フィールドの省略記号のボタンをクリックします。
「Order By句」ダイアログ・ボックスが表示されます。
ソートする属性を選択します。
「使用可能な属性」リストから属性を選択し、「>」ボタンをクリックします。「使用可能な属性」リストのすべての属性を選択するには、「>>」ボタンをクリックします。
属性にORDER BY句を適用します。
「ORDER BY属性」リストから属性を選択し、「昇順/降順」リストから「ASC」(昇順)または「DESC」(降順)を選択します。
「OK」をクリックします。
ソーター演算子の出力をターゲットに接続します。
スプリッタ演算子を使用すると、1つのソースのデータを複数のターゲットに分割できます。
スプリッタ演算子は、ブール分割条件を使用して1つの入力行セットを複数の出力行セットに分割します。各出力行セットのカーディナリティは、入力のカーディナリティ以下となります。これは、データを作成条件に基づいて異なるターゲットに移動する必要がある場合に役立ちます。複数のフィルタを介してデータを移動するかわりにスプリッタを使用できます。
オプションとして、1つのソースのデータを複数のターゲットに分割するマッピングを最適化してパフォーマンスを向上できます。詳細は、「例: 複数のターゲットを使用するマッピングの作成」を参照してください。
スプリッタ演算子には、入力グループ1つと出力グループ3つが含まれています。出力グループはOUTGRP1、OUTGRP2およびREMAINING_ROWSです。必要に応じて、追加の出力グループを作成できます。REMAINING_ROWS出力グループは削除できますが、編集はできません。
ほとんどの場合、出力グループREMAINING_ROWSには、任意の出力グループには含まれないすべての入力行が含まれます。ただし、NULL値の属性が分割条件に含まれる場合、対応する行はREMAINING_ROWS出力グループに移動されません。
スプリッタ演算子には、分割条件が含まれています。コード生成のために、ソース列が式テンプレート内の入力属性名で置換されます。この式は、WHERE句で使用できる有効なSQL式です。
図26-19に、スプリッタ演算子を使用してソース表CUSTOMERS
の顧客データを2つの個別表に分割するマッピングを示します。一方の表には顧客所在地のみが含まれ、他方の表にはその他の顧客詳細が含まれています。スプリッタ演算子の各出力グループの「分割条件」プロパティを使用して、特定のターゲット表に移動するデータを指定します。
マッピングでスプリッタ演算子を使用する手順は、次のとおりです。
スプリッタ演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
ソース演算子のグループをスプリッタ演算子の入力グループに接続します。
出力属性が、対応する入力のデータ型と一致するデータ型を使用して作成されます。
スプリッタ演算子の出力グループを選択します。
プロパティ・インスペクタに出力グループのプロパティが表示されます。
「分割条件」フィールドの右にある省略記号ボタンをクリックします。
「式ビルダー」ダイアログ・ボックスが表示されます。
分割条件を定義します。
たとえば、分割条件としてUPPER(INGRP1.OR_CHANNEL) = 'DIRECT'を定義できます。
REMAINING ROWSグループを除く各出力グループの分割条件について式を定義します。
出力グループをターゲットに接続します。
複数のターゲットを使用するマッピングの設計時には、最適化を行ってパフォーマンスを向上させることができます。マッピングについて正確な監査詳細が必要な場合は、最適化しなくてもかまいません。その場合、ターゲットごとに個別のINSERT文が生成されます。
複数ターゲットのマッピングを最適化するには、組み合された全ターゲットに対して1つのINSERT文が生成されるように、追加の手順を実行する必要があります。この場合、複数表のINSERT SQL文が生成されます。このSQL文は、Oracle9iリリース以降のOracle Databaseサーバーで使用可能なパラレル問合せおよびパラレルDMLサービスを利用します。
複数のターゲットを使用するマッピングを最適化する手順は、次のとおりです。
Oracle9i以降のSQLを生成するように構成されているOracleターゲット・モジュールで、マッピングを定義します。
プロジェクト・ナビゲータで、ターゲット・モジュールを右クリックして「構成」を選択します。「配布システム・タイプ」および「PL/SQL生成モード」の下で、Oracle9i以降を選択します。
マッピング・エディタで、単一のソース、スプリッタ演算子および複数のターゲットを使用するマッピングを設計します。
マッピングを最適化するには、ターゲットはビューやマテリアライズド・ビューではなく表であることが必要です。各ターゲット表の列数は999より少なくなるようにする必要があります。スプリッタ演算子とターゲットの間に、カーディナリティを変更する演算子を含めないでください。
たとえば、図26-20に示すように、スプリッタとターゲットの間にはフィルタを配置できますが、ジョイナ演算子やアグリゲータ演算子は配置できません。これらの制限は、マッピングを最適化するように選択した場合にのみ適用されます。
プロジェクト・ナビゲータで、マッピングを選択してメニュー・バーから「設計」、「構成」を選択します。構成するマッピングを右クリックして「構成」を選択する方法もあります。
マッピングの「構成プロパティ」ダイアログ・ボックスが表示されます。
「ランタイム・パラメータ」を開き、「デフォルト・オペレーティング・モード」を「セット・ベース」に設定します。
「コード生成オプション」を開いて「最適化コード」を「True」に設定します。
このマッピングを実行して生成結果を表示すると、すべてのターゲットについてSELECTとINSERTの合計カウントが1つ戻されます。
副問合せフィルタ演算子を使用すると、副問合せの結果に基づいて行をフィルタできます。行のフィルタに使用できる条件は、EXISTS、NOT EXISTS、INおよびNOT INです。
たとえば、EMP表に従業員データが含まれているとします。副問合せを使用して別の表からレコードのセットをフェッチし、その後、条件EXISTS、NOT EXISTS、INまたはNOT INのいずれかを使用してEMP表の行をフィルタできます。
副問合せフィルタ演算子には、入力グループ1つ(INGRP1)とI/Oグループ1つ(INOUTGRP1)が含まれます。INGRP1は、ソース・データのフィルタリングに使用される副問合せを示すオブジェクトからマッピングされます。データのフィルタリングに使用されるデフォルトの条件はEXISTSで、INGRP1の左に"E"を表示して示されます。この条件は、必要に応じて変更できます。グループINOUTGRP1は、フィルタする必要のあるソース・データ・セットからマッピングされます。フィルタされたデータはこのグループの出力になります。
副問合せフィルタ演算子によってマッピングを作成する手順は次のとおりです。
副問合せフィルタ演算子をマッピング・キャンバスにドラッグ・アンド・ドロップします。
フィルタリングするソースの属性を副問合せフィルタ演算子のI/OグループINOUTGRP1に接続します。
副問合せとして使用するオブジェクトから必要な属性を、副問合せフィルタ演算子のグループINGRP1に接続します。
副問合せフィルタ演算子のヘッダーを選択します。
プロパティ・インスペクタに副問合せフィルタ演算子のプロパティが表示されます。
プロパティ・インスペクタがデザイン・センターに表示されない場合、「表示」メニューから「プロパティ・インスペクタ」を選択します。
「副問合せフィルタ入力ロール」フィールドで、入力行のフィルタリングに使用する条件を選択します。選択できるオプションは、EXISTS、IN、NOT EXISTSまたはNOT INです。
フィルタ条件が必要な場合は、「副問合せフィルタ条件」フィールドの省略記号ボタンをクリックし、式ビルダーを表示します。このインタフェースを使用して、入力行セットと副問合せによって戻された行セットの比較に使用するフィルタ条件を指定します。
入力ロールがINまたはNOT INの場合はフィルタ条件は必要ありません。フィルタ・ロールがEXISTSおよびNOT EXISTSの場合、ソース問合せをEXISTSフィルタ副問合せに関連付けるフィルタ条件を指定する必要があります。
入力ロールがINまたはNOT INの場合、各入力属性のプロパティを編集し、副問合せのI/Oグループから一致する属性を選択します。これによってソース入力問合せの入力属性が各副問合せグループ属性に関連付けられ、ソース問合せがフィルタ副問合せに関連付けられたことになります。
副問合せフィルタ演算子のI/Oグループをターゲットに接続します。
図26-21に、副問合せフィルタ演算子の単純な例を示します。このマッピングでは、信用限度額が特定の値よりも大きい顧客に関する注文データが、CUST_TGTというターゲット表にロードされます。注文データはORDERSおよびORDERS_ITEMS表に格納されます。これらの表から注文データを組み合せるには、ジョイナ演算子が使用されます。副問合せフィルタ演算子を使用して、CUSTOMERS表の副問合せの結果に基づいて注文データをフィルタリングします。
比較に必要なCUSTOMERS表の属性は、副問合せフィルタ演算子の入力グループにマッピングされます。ジョイナ演算子の結果で示される注文データは、副問合せフィルタ演算子の入力/出力グループにマッピングされます。副問合せフィルタ演算子の「副問合せフィルタ条件」プロパティは、行の比較に使用される条件を示すよう設定されています。この例では、副問合せフィルタ条件として、次の条件が指定されています。
INGRP1.CUSTOMER_ID = INOUTGRP1.CUSTOMER_ID AND INGRP1.CREDIT_LIMIT >= 75000
次に、図26-21で示されたマッピングで使用されている副問合せフィルタ演算子に対して、Oracle Warehouse Builderによって生成されるコードを示します。
SELECT "ORDERS"."ORDER_ID" "ORDER_ID", "ORDERS"."CUSTOMER_ID" "CUSTOMER_ID", "ORDERS"."ORDER_DATE" "ORDER_DATE" FROM "OE"."ORDERS"@"ORA11@OE_SRC_LOCATION" "ORDERS" JOIN "OE"."ORDER_ITEMS"@"ORA11@OE_SRC_LOCATION" "ORDER_ITEMS" ON ( ( "ORDERS"."ORDER_ID" = "ORDER_ITEMS"."ORDER_ID" ) ) WHERE (EXISTS (SELECT 1 FROM "OE"."CUSTOMERS"@"ORA11@OE_SRC_LOCATION" "CUSTOMERS" WHERE ( "CUSTOMERS"."CUSTOMER_ID" = "ORDERS"."CUSTOMER_ID" ) AND ( "CUSTOMERS"."CREDIT_LIMIT" >= 75000) ) );
テーブル・ファンクション演算子を使用して、マッピング内のテーブル・ファンクションを示します。テーブル・ファンクション演算子を使用すると、入力行セットを操作し、同一または異なるカーディナリティを持つ別の行セットを戻すことができます。
通常のファンクションは一度に1行のみを処理しますが、テーブル・ファンクションでは行セットに同じ複雑なPL/SQLロジックを適用してパフォーマンスを向上できます。従来型のファンクションとは異なり、テーブル・ファンクションは物理表のように問合せ可能な出力行セットを戻すことができます。
テーブル・ファンクションの実行をパラレル化することもできます。この場合、戻された行は中間のステージングなしで次のプロセスに直接ストリーム化されます。テーブル・ファンクションから戻されるコレクションの行は、テーブル・ファンクションの入力全体の処理が完了してからバッチで出力するかわりに、パイプライン化したり生成時のまま1行ずつ出力できます。
テーブル・ファンクションを使用すると、データ・ウェアハウスのロード時にパフォーマンスを大幅に向上できます。
テーブル・ファンクション演算子には入力グループ1つと出力グループ1つが含まれます。
マッピングでテーブル・ファンクション演算子を定義する手順は、次のとおりです。
テーブル・ファンクション演算子をキャンバスにドラッグ・アンド・ドロップします。
「テーブル・ファンクション演算子の追加」ダイアログ・ボックスが表示されます。
データを変換する既存のテーブル・ファンクションを使用するには、「既存リポジトリ・オブジェクトから選択してバインド」を選択し、ツリーからテーブル・ファンクションを選択します。
テーブル・ファンクション演算子がキャンバスに追加されます。入力グループINGRP1には、テーブル・ファンクションに対して定義されている入力パラメータが含まれています。
テーブル・ファンクションによって使用される入力が含まれている演算子を、入力グループ内のパラメータにマッピングします。
通常、入力パラメータの中の1つ以上はコレクション・タイプです。このような場合、ソース・オブジェクトにコレクション・タイプが含まれていなければ、オブジェクトの構成演算子を使用して、個別のソース属性を使用したコレクション・タイプを作成します。
テーブル・ファンクション演算子から戻されるグループを、変換ターゲットを示す演算子にマッピングします。
図26-22に、テーブル・ファンクション演算子を使用してデータを表にロードするマッピングを示します。
テーブル・ファンクションの特性
名前によるパラメータの受渡しはサポートされていません。
戻り型がTABLE of PLS Recordの場合は、「PLSレコード」フィールドの名前と一致する名前を選択する必要があります。選択リストから選択できるのは、PLS Recordのフィールドのサブセット1つのみです。
戻り型がTABLE of T1%ROWTYPEの場合は、表T1の列名と一致する名前を選択する必要があります。
戻り型がTABLE of Object Typeの場合は、「オブジェクト・タイプ」属性の名前と一致する名前を選択する必要があります。
戻り型がTABLE of Scalar(TABLE of NUMBER
など)の場合、テーブル・ファンクションから戻されるスカラー値の検索に使用できるのはSELECT COLUMN_VALUEのみです。
マッピングでテーブル・ファンクション演算子を使用するには、事前にOracle Warehouse Builder外部のターゲット・スキーマにテーブル・ファンクションを作成します。バインドされていないテーブル・ファンクション演算子でサポートされているデータベース内のテーブル・ファンクションは、次の要件を満たす必要があります。
PLS Record(PLS Recordのフィールドは、Oracle Warehouse Builderでサポートされているスカラー・データ型である必要があります)。
オブジェクト・タイプ(オブジェクト・タイプの属性は、サポートされているスカラー・データ型である必要があります)。
サポートされているスカラー・データ型。
ROWTYPE
マッピング内のテーブル・ファンクション演算子の場合
REFカーソル・タイプ・パラメータごとにパラメータ・グループを1つ追加する必要があります。
1つのスカラー型パラメータ・グループの一部として複数のスカラー・パラメータを使用できます。
パラメータ・グループとグループ内のパラメータは、任意の順序で入力できます。
テーブル・ファンクション演算子のパラメータの位置は、ターゲット・ウェアハウスで作成されるテーブル・ファンクションのパラメータの位置と同じにする必要があります。
テーブル・ファンクション演算子のプロパティにアクセスするには、プロパティ・インスペクタを使用します。プロパティ・インスペクタには、キャンバスで選択したオブジェクトのプロパティが表示されます。たとえば、テーブル・ファンクション演算子の入力グループを選択すると、プロパティ・インスペクタには入力パラメータ・グループのプロパティが表示されます。
テーブル・ファンクション演算子のプロパティは、次のとおりです。
テーブル・ファンクション名: テーブル・ファンクション名を表します。このプロパティでは、テーブル・ファンクションの実際の名前と一致する名前を指定する必要があります。
テーブル・ファンクションはターゲット: テーブル・ファンクションがターゲットであることを指定するには、このオプションを選択します。このプロパティはデフォルトで選択されます。
バウンド名: テーブル・ファンクション演算子のバインド先となるリポジトリ内のテーブル・ファンクションの名前。
変換演算子を使用し、入力行セットのカーディナリティを保持しながら、PL/SQLファンクションを使用して行セットに含まれる行の列値データを変換します。
変換演算子は、ワークスペースのモジュールの1つに含まれるファンクションまたはプロシージャにバインドされる必要があります。変換演算子の入力と出力は、バインド先のワークスペース・ファンクションまたはプロシージャの入力パラメータと出力パラメータに対応します。変換演算子がファンクションにバインドされている場合、結果の出力はファンクションの結果に対応する演算子に追加されます。バインド先のファンクションまたはプロシージャは、ターゲット・システムに存在しないかぎり、マッピングの配布前に生成して配布する必要があります。
Oracle Warehouse Builderでは、ランタイム・スキーマに事前定義済のPL/SQLライブラリ・ファンクションが用意されており、変換演算子をマッピングに追加する際にバインド先ファンクションとして選択できます。また、ファンクションまたはプロシージャはOracleカスタム・ライブラリからも選択できます。
変換演算子のプロパティは次のとおりです。
ファンクション・コール: コール側パラメータとしてリストされた属性名を使用してコード・ジェネレータにより生成されるファンクション・コール用のテキスト・テンプレート。実際のコールでは、属性名はその属性に接続される実際のソース列またはターゲット列で置換されます。
ファンクション名: この演算子のバインド先となるファンクションまたはプロシージャの名前。
プロシージャ: trueの場合は、バインド先変換が戻り値のないファンクションではなくプロシージャであることを示すブール値。
データ型: 指定の属性に対応するバインド先ファンクションの入力、出力または結果パラメータのデータ型を示します。マッピング変換の出力がCHAR
データ型の場合、結果にRTRIMが適用されてからデータがターゲットに移動されます。これにより、出力結果には余分な空白が含まれなくなります。
デフォルト値: 指定の属性のデフォルト値(デフォルト値がない場合は空白)。
オプション入力: trueの場合は、指定の属性がオプションであることを示すブール値。属性がオプションの場合、マッピングで接続する必要はありません。
ファンクション戻り値: trueの場合は、指定の出力属性がファンクションの結果属性であることを示すブール値。結果属性は名前付きの結果です。このプロパティを使用するのは、別の出力が名前付きの結果である場合、または結果出力の名前を変更する場合です。
マッピングで変換演算子を使用する手順は次のとおりです。
変換演算子をマッピング・エディタのキャンバスにドラッグ・アンド・ドロップします。
「変換のマッピングの追加」ダイアログ・ボックスが表示されます。
「変換のマッピングの追加」ダイアログ・ボックスを使用して、変換を作成するか、変換を1つ以上選択します。これらのオプションの詳細は、「演算子を追加するための演算子の追加ダイアログ・ボックスの使用」を参照してください。
変換演算子の入力にソース属性を接続します。
入力属性を選択します。「プロシージャ」プロパティが「True」に設定されている場合、入力パラメータを接続しないでください。
変換演算子の出力属性をターゲット属性に接続します。
注意: 変換のシグネチャが非常に長い場合(デザイン・センター・ウィンドウの長さを超える場合)、この変換をプロジェクト・ナビゲータからマッピング・エディタのキャンバスにドラッグ・アンド・ドロップできない可能性があります。このような場合は、コンポーネント・パレットを使用して変換をマッピングに追加できます。 |
アンピボット演算子は、複数の入力行を1つの出力行に変換します。
アンピボット演算子を使用すると、ソースからの抽出後に、ソース・データ内で属性別にグループ化されているソース行セットから1行を生成できます。ピボット演算子と同様に、アンピボット演算子もマッピングの任意の場所で使用できます。
表26-5に、SALES
リレーショナル表のサンプル・データを示します。クロス集計フォーマットの場合、MONTH
列には年の月ごとに1つずつ最大12の文字値があります。すべての売上データは、MONTHLY_SALES
という1列に含まれます。
表26-5 クロス集計フォーマットのデータ
REP | MONTH | MONTHLY_SALES | REGION |
---|---|---|---|
0675 |
Jan |
10.5 |
4 |
0676 |
Jan |
9.5 |
3 |
0679 |
Jan |
8.7 |
3 |
0675 |
Feb |
11.4 |
4 |
0676 |
Feb |
10.5 |
3 |
0679 |
Feb |
7.4 |
3 |
0675 |
Mar |
9.5 |
4 |
0676 |
Mar |
10.3 |
3 |
0679 |
Mar |
7.5 |
3 |
0675 |
Apr |
8.7 |
4 |
0676 |
Apr |
7.6 |
3 |
0679 |
Apr |
7.8 |
3 |
図26-23に、表がアンピボットされた後のリレーショナル表SALES
のデータを示します。前にMONTH
列に含まれていたデータ(Jan、Feb、Marなど)は、12の個別属性(M1、M2、M3など)に対応します。前にMONTHLY_SALES
に含まれていた売上データは、各月を表す12の属性間に分散されています。
アンピボット演算子を使用すると、行ロケータに基づいて複数の入力行が1行に変換されます。アンピボット演算子では、行ロケータは定義した一連の出力属性に対応するようにソースから選択する必要のある属性です。アンピボット演算子の場合、行ロケータは必須です。この例では、行ロケータはSALES
表のMONTH
列で、アンピボットされた出力の属性M1、M2、M3... M12に対応します。
アンピボット演算子の使用には、次のオプションが用意されています。
新しいアンピボット演算子の定義: アンピボット演算子をパレットからマッピングにドラッグします。マッピング・エディタにウィザードが表示されます。
既存のアンピボット演算子の編集: アンピボット演算子を右クリックして「詳細を開く」を選択します。マッピング・エディタのアンピボット・エディタが開きます。
アンピボット・ウィザードとアンピボット・エディタのどちらを使用する場合も、次のページを完了します。
一般ページを使用して、アンピボット演算子の名前と説明(オプション)を指定します。デフォルトでは、ウィザードにより演算子名「アンピボット」が指定されます。
グループ・ページを使用して、入力グループと出力グループをそれぞれ1つ指定します。
アンピボット演算子の場合、入力グループはクロス集計フォーマットのソース・データを表します。出力グループは、複数の属性間で分散されるターゲット・データを表します。
入力グループと出力グループの名前を変更したり、説明を追加できます。各アンピボット演算子の入力グループと出力グループはそれぞれ1つのみである必要があるため、ウィザードでグループの追加や削除またはグループの方向の変更はできません。
接続の入力ページを使用して、属性を選択し、アンピボット演算子にコピーおよびマップします。
アンピボット演算子の接続の入力ページを完了する手順は、次のとおりです。
左側のパネルで、グループ全体または個別の属性を選択します。
特定の属性またはグループを名前で検索するには、「検索」にテキストを入力して「実行」をクリックします。次の一致を検索するには、「実行」を再度クリックします。
複数のグループまたは属性を選択するには、[Shift]キーを押しながら選択します。異なるグループの属性を選択するには、最初にジョイナ演算子または集合演算子を使用してグループを結合する必要があります。
ページ中央にある「>」ボタンを使用して、選択内容をウィザード・ページの右側に移動します。
接続の入力のリストからグループまたは属性を移動するには、「<」矢印を使用できます。Oracle Warehouse Builderでは、選択内容が入力グループから削除され、ソース演算子とアンピボット演算子間のデータ・フロー接続も削除されます。
入力属性ページで、「接続の入力」タブまたはウィザード・ページで選択した属性を変更します。
アンピボットの入力属性ページでは、次のタスクを実行できます。
属性の追加: このページの空白行に属性名やその他の属性の詳細を入力します。
属性のプロパティの変更: 属性名、データ型、長さ、精度およびスケールを変更できます。
説明(オプション)の追加: 入力属性の説明を入力します。
キー属性の指定: アンピボット演算子には1つ以上のキー属性を指定する必要があります。「キー」チェック・ボックスを使用して、入力グループを一意に識別する属性を指定します。キー属性の同じ値を持つ入力行から、アンピボットされた出力行が1つ生成されます。
行ロケータ・ページを使用して、行ロケータを選択し、行ロケータに含まれる個別値に値を割り当てます。
図26-24では、「Jan」、「Feb」、「Mar」などの値を持つMONTH
属性が行ロケータとして選択されています。
アンピボットの行ロケータ・ページで指定する手順は次のとおりです。
「行ロケータ」リスト・ボックスから属性を選択します。
アンピボット演算子における行ロケータは、出力属性セットに対応するソース・データの属性です。
「追加」を使用して、行ロケータに存在する個別の値の数を指定します。
各行ロケータの値には、ソース・データ・セットに表示されている値を入力します。
文字列値の場合は、一重引用符でテキストを囲みます。たとえば、行ロケータが「MONTH」
の場合、その属性には合計12の個別値があります。「追加」をクリックして、各個別値の行を追加します。行ロケータ値には、ソース・データ・セットに表示される値をそのまま入力します。たとえば、表26-5に示す行ロケータ値は、'Jan'、'Feb'および'Mar'となります。
「出力属性」タブを使用して、アンピボット演算子の出力属性を作成します。
図26-25に、「出力属性」タブを示します。
「入力属性」タブまたはウィザード・ページで入力属性をキーとして指定した場合、これらの入力属性は、編集も削除もできない出力属性として表示されます。
アンピボットの出力属性ページでは、次のタスクを実行できます。
属性の追加: 「行ロケータ」タブまたはウィザード・ページで指定した行に対応する出力属性の数を増やすには、ページの空白のセルに属性の詳細を入力します。12の行を指定した場合は、12の出力属性と、キーとして指定しなかった他の入力属性の属性を指定します。
属性のプロパティの変更: 「入力属性」タブまたはウィザード・ページでキーとして指定した属性を除いて、属性名、データ型、長さ、精度およびスケールを変更できます。
説明(オプション)の追加: 出力属性の説明を入力します。
「アンピボット変換」タブで、各出力属性の式を記述します。
図26-26に、「アンピボット変換」タブを示します。
キーとして指定した属性の場合、一致する行と式が自動的に定義されます。Oracle Warehouse Builderでは、キー属性に一致する行として最初の行が表示されます。その他の出力属性の場合、一致する行および式を指定します。
一致する行: リスト・ボックスで該当するオプションを選択します。たとえば、年の最初の月として「M1」を定義した属性の場合、リスト・ボックスから「Jan」を選択します。
式: リスト・ボックスで該当する式を選択します。データをアンピボットするために作成したすべての新しい属性には、対応するデータが含まれる同じ入力属性を選択します。たとえば、アンピボット属性M1、M2、M3...M12はすべて、同じ式であるINGRP1.MONTHLY_SALESを共有します。その他のすべての出力属性には、入力属性のリストから対応する属性を選択します。