データの変換は、抽出、変換およびロード(ETL)ツールの主要な機能の1つです。Oracle Warehouse Builderには、データの変換方法がいくつか用意されています。この章では、変換について説明し、Oracle Warehouse Builderを使用したカスタム変換の作成方法を説明します。また、変換定義をインポートする方法についても説明します。
この章の内容は次のとおりです。
Oracle Warehouse Builderには、ソース・データに必要な変換を定義できる直感的なユーザー・インタフェースが用意されています。ソース・データを変換するには、次のいずれかの方法を使用します。
変換: デザイン・センターにはデータ変換に使用する変換セットが含まれています。Oracle Warehouse Builderに用意されている事前定義済変換を使用、または要件に適合するカスタム変換を定義できます。
カスタム変換はOracleモジュールで定義する他のデータ・オブジェクトと同じようにOracle Databaseに配布できます。変換の詳細は、「変換について」を参照してください。
演算子: マッピング・エディタには、ソースからターゲットへのデータの移動方法を定義するときに共通変換を定義できる事前作成された変換演算子のセットが含まれています。変換演算子とは、事前作成されたPL/SQLファンクション、プロシージャ、パッケージ・ファンクションおよびパッケージ・プロシージャです。入力データを取得し、演算を実行し、結果を生成します。
事前作成された演算子のほかに、変換演算子を使用してマッピング・エディタで定義するカスタム変換を使用できます。これらの演算子の詳細は、第26章 「データ・フロー演算子」を参照してください。
Oracle Warehouse Builderを使用すると、PL/SQLを再利用および独自のカスタムPL/SQL変換を記述できます。これらのカスタム変換はOracle Warehouse Builderマッピングで使用できます。
すべての主要リレーショナル・データベース管理システムはSQLをサポートしており、SQLで記述されたすべてのプログラムはわずかな修正を加えるだけで、あるデータベースから別のデータベースに移動できます。つまり、組織内のすべてのSQLナレッジはOracle Warehouse Builderに完全移植可能です。Oracle Warehouse Builderを使用すると、既存の複雑なカスタム・コードをインポートおよび維持できます。
カスタム変換には、プロシージャ、ファンクションおよびパッケージが含まれます。Oracle Warehouse Builderには、各タイプのカスタム変換を作成するためのウィザードが用意されています。カスタム変換は、パブリックOracleカスタム・ライブラリまたはプロジェクト内のモジュールに含めることができます。
パブリックOracleカスタム・ライブラリのカスタム変換
パブリックOracleカスタム・ライブラリの一部であるカスタム変換は、定義されているワークスペースのすべてのプロジェクトで使用できます。たとえば、ADD_EMPL
というファンクションをワークスペースREP_OWNER
のパブリックOracleカスタム・ライブラリに作成するとします。このプロシージャはREP_OWNER
のすべてのプロジェクトで使用できます。
グローバル・ナビゲータのパブリック変換ノードのカスタム・ノードを使用して、ワークスペース内のすべてのプロジェクトで使用できるカスタム変換を定義します。
カスタム変換をパブリックOracleカスタム・ライブラリに作成する手順は、次のとおりです。
グローバル・ナビゲータから「パブリック変換」ノードを展開し、次にOracleノードを展開します。
カスタム・ノードを右クリックして「新規」を選択します。
作成できる変換タイプが含まれる「新規ギャラリ」ダイアログボックスが表示されます。ここには、ファンクション、プロシージャおよびパッケージが含まれています。PL/SQLタイプはパッケージの一部としてのみ作成できます。
作成する変換タイプを選択し、「OK」をクリックします。
テーブル・ファンクションの場合は、テーブル・ファンクションの作成ウィザードが表示されます。このウィザードを使用して、「表ファンクションの定義」の説明に従って表ファンクションを定義します。
ファンクション、プロシージャ、パッケージには、それそれ「ファンクションの作成」ダイアログボックス、「プロシージャの作成」ダイアログボックス、「パッケージの作成」ダイアログボックスが表示されます。名前とオプションの説明を入力し、「OK」をクリックします。パッケージの場合は、プロジェクト・ナビゲータにパッケージが追加されます。ファンクションおよびプロシージャの場合は、エディタが表示されます。そのエディタを使用して、ファンクションまたはプロシージャを定義します。
「ファンクションおよびプロシージャの定義」および「PL/SQLタイプの定義」を参照してください。
プロジェクト内のカスタム変換
現在のモジュールまたはプロジェクトでのみ必要なカスタム変換を定義する必要が生じる場合があります。そのような場合は、プロジェクトのOracleモジュールにカスタム変換を定義できます。Oracleモジュールにカスタム変換を定義すると、定義されているプロジェクトのすべてのモジュールから変換にアクセスできます。たとえば、 PROJECT1
とPROJECT2
の2つのプロジェクトを所有するREP_OWNER
というワークスペースの所有者を考えてみてください。PROJECT1
のSALES
というOracleモジュールに、CALC_SAL
というプロシージャを定義します。このプロシージャはPROJECT1
に属するすべてのモジュールで使用できますが、PROJECT2
にはアクセスできません。
Oracleモジュールにカスタム変換を定義する手順は、次のとおりです。
プロジェクト・ナビゲータから、カスタム変換を定義するOracle Warehouse Builderモジュール・ノードを展開します。
変換ノードを右クリックして「新規」を選択します。
「新規ギャラリ」ダイアログ・ボックスが表示されます。
作成する変換タイプを選択し、「OK」をクリックします。
ファンクションおよびプロシージャの場合は、「ファンクションの作成」ダイアログ・ボックスまたは「プロシージャの作成」ダイアログ・ボックスが表示されます。名前とオプションの説明を入力し、「OK」をクリックします。その変換用のエディタが表示されます。エディタのタブを使用して、変換を定義します。パッケージの場合は、名前と説明を定義してから「OK」をクリックすると、プロジェクト・ナビゲータにパッケージが追加されます。続けて、パッケージの一部である変換を定義できます。
テーブル・ファンクションの場合は、テーブル・ファンクションの作成ウィザードのようこそページが表示されます。PL/SQLタイプはパッケージにのみ作成できます。
ファンクションまたはプロシージャを定義するファンクション・エディタまたはプロシージャ・エディタを使用して、次の手順を実行します。
注意: ファンクションはプラットフォーム間でコピーおよび貼付けできません。たとえば、ファンクションをOracleモジュールからコピーして、SQL Serverモジュールに貼り付けることはできません。 |
「名前と説明」ページを使用してカスタム変換を記述します。このページでは、次の詳細を指定します。
名前: カスタム変換の名前を表します。ネーミング規則の詳細は、「データ・オブジェクトのネーミング規則」を参照してください。
説明: カスタム変換の説明を表します。このフィールドはオプションです。
「パラメータ」タブを使用して、変換の入力パラメータと出力パラメータを定義、変更または削除します。ファンクションの場合は、「戻り型」という追加フィールドが表示されます。「戻り型」フィールドはファンクションにより戻される値のデータ型を表します。リスト内の使用可能なオプションから戻り型を選択します。
Oracleモジュールに定義された変換の場合は、各パラメータに次の詳細を指定します。
名前: パラメータ名を入力します。
データ型: リストからパラメータのデータ型を選択します。
I/O: パラメータのタイプを選択します。使用可能なオプションは「入力」、「出力」および「I/O」です。
必須: パラメータを必須として指定するには「はい」を、オプションとして指定するには「いいえ」を選択します。
デフォルト値: パラメータのデフォルト値を入力します。デフォルト値は、ファンクションまたはプロシージャの実行時にパラメータ値を指定しない場合に使用されます。
DB2モジュールで定義された変換には、各パラメータの詳細(名前、データ型、長さ、精度、スケール)が含まれます。
長さは文字データ型にのみ適用され、パラメータの長さを表します。精度はパラメータに使用できる合計桁数を表し、数値データ型にのみ適用されます。スケールは小数点以下の合計桁数を表し、数値データ型にのみ適用されます。
SQL Serverモジュールで定義された変換には、各パラメータの詳細(名前、データ型、長さ、精度、スケール、必須、デフォルト値)が含まれます。
実装タブを使用して、変換の実装詳細(コードなど)を指定または変更します。「生成」をクリックし、実装コードを検証および生成します。
エディタを終了する前に、ファンクションまたはプロシージャの定義の変更を保存してください。ツールバーの「すべて保存」をクリック、または「ファイル」メニューの「保存」を選択すると変更を保存できます。
表ファンクションとは、入力として行セットを取得し、出力として行セットを生成するファンクションです。表ファンクションへの入力は、スカラー・データ型、コレクション・データ型(PL/SQLレコード、可変長配列およびネストした表)またはRefカーソルです。表ファンクションの出力は、ネストした表または可変長配列のいずれかです。表ファンクションは通常のデータベース表のように問合せできます。
パラレル化では、テーブル・ファンクションから戻された行を次のプロセスに直接ストリーム化できるため、テーブル・ファンクションの出力の中間のステージングが不要になります。
テーブル・ファンクションによって、よりフレキシブルでパワフルな変換および使用が可能になります。提供された変換演算子を使用しないで、独自の特別な変換を作成してユーザー定義集計やデータ・マイニングなどのタスクを実行できます。テーブル・ファンクションによりパラレルでパイプライン化された変換の実行がサポートされ、結果的にパフォーマンスが向上します。
関連項目: テーブル・ファンクションの詳細は、『Oracle Database SQL言語クイック・リファレンス』を参照してください。 |
次の手順を使用して、テーブル・ファンクションを定義します。
パラレル化オプションの指定(オプション)
データ・ストリーム・オプションの指定(オプション)
名前ページの次のフィールドを使用して、テーブル・ファンクションの説明をします。
名前: テーブル・ファンクション名を表します。名前はOracle Warehouse Builderオブジェクトの命名規則に従う必要があります。
テーブル・ファンクションの名前を変更するには、名前を選択して新しい名前を入力します。テーブル・ファンクションの名前を変更したら、再配布する必要があります。また、テーブル・ファンクションを使用するマッピングも同期化します。
「説明」: テーブル・ファンクションの説明(オプション)を表し、最大4,000文字長。
テーブル・ファンクションの戻り値型は、ネスト化した表と可変長配列のコレクション・タイプにできます。戻り型ページに、戻り値型として選択できるコレクション・タイプが表示されます。テーブル・ファンクションの戻り型として使用するコレクション・タイプを選択します。
Oracleモジュールで定義されたテーブル・ファンクションの場合は、次の戻り値型を使用できます。
テーブル・ファンクションが定義されたプロジェクトに含まれるOracleモジュールで定義されたネスト化した表および可変長配列
グローバル・ナビゲータのパッケージの一部として定義された公開されたネスト化した表
グローバル・ナビゲータを使用して公開されたテーブル・ファンクションの場合、戻り値型として使用できるのは公開されたネスト化した表と公開された可変長配列のみです。
パラメータページまたはパラメータタブを使用して、テーブル・ファンクションの入力パラメータを定義します。各パラメータに、次の詳細を入力します。
名前: パラメータ名を入力します。
タイプ: リストからパラメータのデータ型を選択します。
ネスト化した表以外のパラメータは、Oracleスカラー・データ型またはユーザー定義のコレクション・タイプにできます。通常、テーブル・ファンクションの入力パラメータは、レコード・タイプ、表タイプまたはREFカーソル・タイプなどのコレクション・タイプです。コレクション・タイプはユーザー定義であるため、テーブル・ファンクション・パラメータのデータ型として使用する前に定義する必要があります。コレクション・タイプを定義できるのは、公開されたパッケージまたはOracleモジュール内のパッケージの一部としてのみです。
I/O: パラメータのタイプを選択します。テーブル・ファンクションに使用できるオプションは入力のみです。
必須: パラメータを必須として指定するには「はい」を、オプションとして指定するには「いいえ」を選択します。
デフォルト値: パラメータのデフォルト値を入力します。デフォルト値は、テーブル・ファンクションの実行時にパラメータ値を指定しない場合に使用されます。
パラメータを変更するには、パラメータ値を選択して新しい値を入力します。変更後は、テーブル・ファンクションを再配付します。
テーブル・ファンクションの実行をパラレル化すると、ステージング・テーブルを省略できます。テーブル・ファンクションの実行をパラレル化すると、テーブル・ファンクションによって戻される行を中間ステージングなしで次のプロセスに直接ストリームできます。これによって、テーブル・ファンクションのマルチスレッドおよび同時実行が可能になります。
テーブル・ファンクションのパラレル実行は、複数のスレーブ・プロセスを使用して実行されます。テーブル・ファンクションをパラレルで実行するには、データのパーティション化に使用するREFカーソル・タイプの入力パラメータを1つ指定する必要があります。
テーブル・ファンクションの実行をパラレル化するための詳細は、次のとおりです。
パラレル: テーブル・ファンクションの実行をパラレル化する必要があることを示す場合は、このオプションを選択します。
このオプションは、1つ以上の入力パラメータがREFカーソル・タイプの場合のみ有効になります。
パーティション・メソッド パーティション・メソッドを選択します。パーティション・メソッドとして、すべて、レンジまたはハッシュを選択できます。
パラメータ: パーティション化を実行する必要がある入力パラメータを選択します。パーティション化パラメータとして選択できるパラメータはREFカーソル・タイプのみです。したがって、このフィールドにはタイプREFカーソルの入力パラメータのみがリストされます。
パーティション化の属性: パーティション化を実行する必要があるREFカーソルの属性を選択します。「使用可能な属性」セクションで、テーブル・ファンクションの入力パラメータの基準となるREFカーソルの属性をリストします。属性を選択し、矢印を使用して「選択済」セクションへ移動します。
「順序」ページを使用して、テーブル・ファンクションでストリームを実行します。データ・ストリームを実行する際、テーブル・ファンクションはカーソル引数からフェッチする行を順序付けまたはクラスタ化します。順序付けまたはクラスタ化は特定のキーまたはキー列を使用して実行します。クラスタ化を行うと、入力キーの値が同じ行が表示されますが、行の順序付けは行われません。
データ・ストリームを実行するには、このページで次の情報を入力します。
「順序付け方法」: データ・ストリームに使用する方法を指定します。行の順序付けには「順序」を、行のクラスタ化には「クラスタ」を選択できます。
「順序付けの属性」: 順序付けまたはクラスタ化を実行する属性を選択します。「使用可能な属性」セクションには、REFカーソル・タイプの入力パラメータの属性がリストされます。属性を1つ以上選択し、矢印を使用して属性を「選択済」セクションへ移動します。
実装ページで、次の詳細を指定します。
「パイプライン」Pipelined: 「パイプライン」オプションを選択してパイプライン・テーブル・ファンクションを作成します。パイプラインは、すべてのテーブル・ファンクションの処理完了後に単一バッチで戻すのではなく、作成されるたびに反復して行を戻します。パイプラインを使用すると、テーブル・ファンクションは行を迅速に戻すことができ、テーブル・ファンクションの結果のキャッシュに必要なメモリー量を減らすことができます。問合せの応答時間が短縮されます。パイプラインを使用すると、テーブル・ファンクションを仮想テーブルとして使用できます。
実装: 「実装」セクションでは、テーブル・ファンクション定義ごとにコメント付きのサンプル・コードが提供されます。「コード・エディタ」をクリックすると、デフォルトのサンプル・コードを編集し、テーブル・ファンクションのコードを入力できるコード・エディタが表示されます。
「PL/SQLタイプの作成」ウィザードを使用して、PL/SQLタイプを作成します。PL/SQLタイプはパッケージ内に定義する必要があり、単独では存在できません。
PL/SQLタイプを使用すると、コレクション・タイプ、レコード・タイプおよびREFカーソル・タイプをOracle Warehouse Builderに作成できます。PL/SQLタイプは、サブプログラムのパラメータとして、またはファンクションに対する戻り型として使用します。PL/SQLタイプをサブプログラムに対するパラメータとして使用すると、任意の数の要素を処理できます。バルクSQLを使用してデータベース表との間でデータを移動するには、コレクション・タイプを使用します。PL/SQLタイプの詳細は、Oracle Database PL/SQL言語リファレンスを参照してください。
Oracle Warehouse Builderを使用すると、次のPL/SQLタイプを作成できます。
PL/SQLレコード・タイプ
レコード・タイプを使用すると、パッケージにレコードを定義できます。レコードとは、複数のフィールドを持つ複合データ構造です。関連する項目を保持し、その項目を単一のパラメータを使用してサブプログラムに渡すには、レコードを使用します。
たとえば、EMPLOYEE
レコードにはID、名前、姓、住所、誕生日、雇用日、給与など、従業員に関連する詳細を格納できます。EMPLOYEE
レコードに基づいてレコード・タイプを作成し、そのレコード・タイプを使用してサブプログラム間で従業員データを渡すことができます。
REFカーソル・タイプ
REFカーソル・タイプを使用すると、パッケージ内にREFカーソルを定義できます。REFカーソルは単一の問合せにバインドされず、異なる複数の結果セットを指し示すことができます。REFカーソルは、あるサブプログラムで問合せを実行し、その結果を別のサブプログラムで処理する場合に使用します。また、REFカーソルを使用すると、問合せの結果セットを、PL/SQLが格納されたサブプログラムと様々なクライアント(OCIクライアントやOracle Formsアプリケーションなど)との間で渡すことができます。
REFカーソルはすべてのPL/SQLクライアントで使用できます。たとえば、REFカーソルをPL/SQLホスト環境(OCIやPro*Cプログラムなど)で宣言し、そのREFカーソルを入力ホスト変数(バインド変数)としてPL/SQLに渡すことができます。PL/SQLエンジンを持つOracle Formsなどのアプリケーション開発ツールでは、クライアント側全体でカーソル変数を使用できます。また、リモート・プロシージャ・コールを介して、カーソル変数をクライアントとデータベース・サーバーとの間で受け渡すことができます。
ネストした表のタイプ
ネストした表のタイプを使用して、パッケージ内のネストした表を定義します。ネストした表は順序を設定していない要素セットで、すべてが同じデータ型です。要素数が宣言されていない1つのディメンション配列に類似しています。要素が表でもあるネストした表を作成して多次元配置をモデル化できます。
たとえば、任意の数の従業員IDを保持できるネストした表のタイプを作成できます。このネストした表のタイプは、ネストした表のタイプに含まれる従業員レコードのみを処理するサブプログラムにパラメータとして渡すことができます。
SALES
表には、全世界に事業所を持つ組織の毎日の売上が格納されます。この表には、売上ID、売上日、顧客ID、製品ID、売上金額、売上数量および売上の計上に使用した通貨が含まれます。経営側は、指定期間の全世界の売上を単一の通貨(たとえばUSドル)で分析することを望んでいます。このため、すべての売上値をUSドルに換算する必要があります。通貨換算レートは毎日変化する可能性があるため、売上金額は、売上日における売上通貨の換算レートを使用して計算する必要があります。
PL/SQLレコード・タイプを使用したソリューション
図9-1は、PL/SQLレコード・タイプを使用して指定した通貨での売上金額の取得に使用するマッピングを表示したものです。
このマッピングでは、様々な通貨で格納された個々の売上データを基に、指定通貨での売上値を取得し、このデータをターゲット表にロードします。このマッピングを作成する手順は、次のとおりです。
グローバル・ナビゲータで、パッケージを作成します。このパッケージで、CURR_CONV_PROC
というプロシージャを作成します。
このプロシージャは、指定期間内に毎日Webサイトから通貨換算値を取得します。このプロシージャの入力パラメータは、売上通貨、売上値を換算する必要のある通貨および通貨換算が必要な期間です。このデータは、タイプCURR_CONV_REC
のPL/SQLレコード・タイプに格納されます。このレコード・タイプは、日付と変換値の2つの属性を含んでいます。
PL/SQLレコード・タイプはパッケージの一部として作成します。
変換演算子を含むマッピングを作成します。この演算子は、CURR_CONV_PROC
プロシージャにバインドされます。
マッピング入力パラメータ演算子を使用して、変換演算子の入力パラメータの値を指定します。
変換演算子の出力グループは、タイプCURR_CONV_REC
のPL/SQLレコード・タイプです。
オブジェクトの拡張演算子を使用して、このレコード・タイプに格納された個々の値を取得し、表CURRENCY_TAB
に格納します。
アグリゲータ演算子を使用して、各注文書の売上詳細を集計します。
SALES
表はトランザクション表であり、データを正規化形式で格納します。各注文書の集計売上を取得するには、アグリゲータ演算子を使用して売上データを集計します。
ジョイナ演算子を使用して、集計後の売上詳細を結合します。この集計後の売上詳細は、CURRENCY_TAB
表のデータを使用したアグリゲータ演算子の出力です。売上日が結合条件として使用されます。
式演算子を使用して売上金額と通貨換算レートを乗算し、必要な通貨での売上合計を取得します。換算後の売上データをCONV_SALES_TAB
表にロードします。
PL/SQLタイプは、デザイン・センターのプロジェクト・エクスプローラまたはグローバル・エクスプローラで作成できます。
「PL/SQLタイプの作成」ウィザードを使用して、PL/SQLタイプを作成します。「PL/SQLタイプの作成」ウィザードを表示するには、パッケージの下の「PL/SQLタイプ」のノードを右クリックし、「新規PL/SQLタイプ」を選択します。「PL/SQLタイプの作成」ウィザードの「ようこそ」ページが表示されます。「次へ」をクリックし、 ウィザードに表示される指示に従って次の各ページを完了します。
「名前と説明」ページを使用して、PL/SQLタイプの名前とオプションの説明を入力します。また、このページを使用して、作成するPL/SQLタイプのタイプを選択します。
次のいずれかのPL/SQLタイプを作成できます。
PL/SQLレコード・タイプ
REFカーソル・タイプ
NESTED TABLE型
各PL/SQLタイプの詳細は、「PL/SQLタイプについて」を参照してください。
名前を指定し、作成するPL/SQLタイプのタイプを選択した後、「次へ」をクリックします。
「属性」ページを使用して、PL/SQLレコード・タイプの属性を定義します。PL/SQLレコード・タイプの属性のみを指定します。PL/SQLレコードには、少なくとも1つの属性が必要です。
属性ごとに、次の内容を定義します。
名前: 属性の名前。この名前はレコード・タイプ内で一意にする必要があります。
データ型: 属性のデータ型。リストからデータ型を選択します。
長さ: データ型の長さ(文字データ型の場合)。
精度: 属性に使用できる合計桁数(数値データ型の場合)。
スケール: 小数点以下の合計桁数(数値データ型の場合)。
秒精度: 日時フィールドの小数部の桁数。0から9までの数値を入力できます。秒精度はTIMESTAMP
、TIMESTAMP WITH TIME ZONE
およびTIMESTAMP WITH LOCAL TIME ZONE
データ型に対してのみ使用されます。
「次へ」をクリックして次の手順に進みます。
「戻り型」ページを使用して、PL/SQLタイプの戻り型を選択します。REFカーソルおよびネストした表を作成する場合は、戻り型のみを指定する必要があります。
REFカーソルを定義する手順は、次のとおりです。
REFカーソルの戻り型は、PL/SQLレコード・タイプのみです。PL/SQLレコード・タイプの名前がわかっている場合は、「検索」フィールドに名前を入力し、「実行」をクリックして検索できます。
「検索」フィールドの下のエリアに使用可能なPL/SQLタイプが表示されます。これらのPL/SQLタイプは、「パブリック」と「プライベート」の2つのノードにグループ化されます。「パブリック」ノードを開いて、Oracle共有ライブラリに含まれているPL/SQLタイプを表示します。このタイプは、パッケージ名別にグループ化されます。「プライベート」ノードには、Oracleモジュール内のパッケージの一部として作成されるPL/SQLタイプが含まれています。現在のプロジェクトに属しているPL/SQLタイプのみが表示されます。各Oracleモジュールはノードで表されます。モジュール内では、PL/SQLタイプは属しているパッケージごとにグループ化されます。
ネストした表を定義する手順は、次のとおりです。
ネストした表の場合、戻り型はスカラー・データ型またはPL/SQLレコード・タイプになります。PL/SQLタイプによって戻される型に基づき、次のオプションのいずれかを選択します。
戻り型としてスカラー型を選択します。
このオプションを使用すると、スカラー型を戻すPL/SQLタイプを作成できます。リストを使用してデータ型を選択します。
戻り型としてPL/SQLレコード・タイプを選択します。
このオプションを使用すると、PL/SQLレコード・タイプを戻すPL/SQLタイプを作成できます。戻されるPL/SQLレコード・タイプの名前がわかっている場合は、「検索」フィールドにその名前を入力して「実行」をクリックします。検索結果がオプションの下のエリアに表示されます。
表示される使用可能なタイプのリストから戻り型を選択することもできます。このオプションの下のエリアには、「パブリック」と「プライベート」の2つのノードがあります。「パブリック」ノードには、Oracle共有ライブラリの一部であるPL/SQLレコード・タイプが含まれています。PL/SQLレコード・タイプは、属しているパッケージ別にグループ化されます。「プライベート」ノードには、現在のプロジェクト内で各Oracleモジュールの変換として作成されるPL/SQLレコード・タイプが含まれています。このPL/SQLレコード・タイプは、モジュール別にグループ化されます。PL/SQLタイプによって戻されるPL/SQLレコード・タイプを選択します。
「次へ」をクリックして、PL/SQLタイプの作成に進みます。
サマリー・ページには、ウィザードの各ページで選択したオプションが表示されます。オプションを確認します。オプションを変更するには、「戻る」をクリックします。「終了」をクリックすると、PL/SQLタイプが作成されます。
カスタム変換の定義は、エディタを使用して編集できます。プロパティの編集は常に一貫して行ってください。たとえば、パラメータの名前を変更した場合は、実装コード内の名前も変更する必要があります。
カスタム変換を編集したら、次の点を確認してください。
編集した変換を参照するマッピング演算子と編集済変換との同期化
同期化すると、マッピング内の変換の定義が編集中に変更した内容で更新されます。
編集済変換が含まれるマッピングの再配布
「ファンクションの編集」ダイアログ・ボックスを使用すると、ファンクション定義を編集できます。プロシージャ定義を編集するには、「プロシージャの編集」ダイアログ・ボックスを使用します。
ファンクション、プロシージャまたはパッケージを編集する手順は、次のとおりです。
プロジェクト・ナビゲータから、変換が作成されているOracleモジュールを開きます。次に、「変換」ノードを開きます。
パブリックOracleカスタム・ライブラリに含まれる変換を編集するには、グローバル・ナビゲータから「パブリック変換」ノードを開き、次に「カスタム」ノードを開きます。
編集するファンクション、プロシージャまたはパッケージの名前を右クリックし、「開く」を選択します。または、ファンクション、プロシージャまたはパッケージの名前をダブルクリックします。
ファンクションの場合は、ファンクション・エディタが表示されます。プロシージャの場合は、プロシージャ・エディタが表示されます。次のタブを使用して、ファンクションまたはプロシージャの定義を編集します。
「名前」タブは、「カスタム変換のネーミング」を参照
「パラメータ」タブは、「パラメータの定義」を参照
「実装」タブは、「実装の指定」を参照
パッケージの場合は、「変換ライブラリの編集」ダイアログ・ボックスが表示されます。編集できるのは、パッケージの名前と説明のみです。パッケージ内に含まれるファンクションおよびプロシージャは、ファンクションまたはプロシージャの編集に使用する手順で編集できます。
PL/SQLタイプの編集ダイアログ・ボックスを使用すると、PL/SQLタイプの定義を編集できます。PL/SQLタイプを編集する手順は、次のとおりです。
プロジェクト・ナビゲータから、PL/SQLタイプを含むOracleモジュールを開きます。次に、「変換」ノードを開きます。
パブリックOracleカスタム・ライブラリに格納されているPL/SQLタイプを編集するには、グローバル・ナビゲータで「パブリック変換」 ノードを開き、次に「カスタム」ノードを開きます。
PL/SQLタイプを含むパッケージを開き、次に「PL/SQLタイプ」ノードを開きます。
編集するPL/SQLタイプの名前を右クリックし、「開く」を選択します。または、PL/SQLタイプの名前をダブルクリックします。
「PL/SQLタイプの編集」ダイアログ・ボックスが表示されます。PL/SQLタイプを編集するタブは、次のとおりです。
「名前」タブには、PL/SQLタイプの名前と説明が表示されます。このタブを使用して、PL/SQLタイプの名前または説明を編集します。
PL/SQLタイプの名前を変更するには、名前を選択して新しい名前を入力します。
「属性」タブには、PL/SQLレコード・タイプの既存の属性の詳細が表示されます。このタブは、PL/SQLレコード・タイプに対してのみ表示されます。既存の属性を変更、新規属性を追加または属性を削除できます。
新規属性を追加するには、空白行の「名前」列をクリックして属性の詳細を指定します。属性を削除するには、属性を表す行の左側にあるグレーのセルを右クリックし、「削除」を選択します。
「戻り型」タブを使用して、PL/SQLタイプの戻り型の詳細を変更します。REFカーソル・タイプの場合は、戻り型はPL/SQLレコードである必要があります。ネストした表の場合、戻り型はPL/SQLレコード・タイプまたはスカラー・データ型になります。
テーブル・ファンクションの定義を編集し、その仕様を変更できます。
テーブル・ファンクションの編集手順:
テーブル・ファンクションが含まれるOracleモジュール、変換ノード、テーブル・ファンクション・ノードの順に開きます。
グローバル・テーブル・ファンクションの場合は、「パブリック変換」ノードを開き、次に「カスタム」ノードを開きます。
テーブル・ファンクションがパッケージに属する場合は、最初にパッケージ・ノードを開きます。編集するテーブル・ファンクションの名前を右クリックし、「開く」を選択します。または、テーブル・ファンクションの名前をダブルクリックします。
テーブル・ファンクション・エディタが表示されます。
次のタブを使用して、テーブル・ファンクションを編集します。
名前タブは、「テーブル・ファンクションのネーミング」を参照
戻り型タブは、「戻り型の指定」を参照
パラメータ・タブは、「テーブル・ファンクションの入出力パラメータの指定」を参照
パーティション・タブは、「パラレル化オプションの指定」を参照
順序タブは、「データ・ストリーム・オプションの指定」を参照
実装タブは、「テーブル・ファンクション実装の指定」を参照
インポート・メタデータ・ウィザードを使用して、Pl/SQLファンクション、プロシージャおよびパッケージをOracle Warehouse Builderプロジェクトへインポートします。スカラー・ファンクションはIBM DB2およびSQL Serverデータベースからもインポートできます。
インポートしたPL/SQLファンクションおよびプロシージャは編集、保存、および配布できます。また、インポートしたパッケージの表示および変更もできます。
プロジェクトへの変換のインポート手順:
プロジェクト・ナビゲータからプロジェクト・ノードを開き、次に「データベース」ノードを開きます。
変換のインポート元のデータベースに対応するノードを開きます。
たとえば、OracleデータベースからPL/SQLファンクションをインポートする場合は、Oracleノードを右クリックします。IBM DB2UDBデータベースからスカラー・ファンクションをインポートする場合は、DB2ノードを右クリックします。
変換のインポート先のモジュールを右クリックし、「インポート」を選択してから、「データベース・オブジェクト」を選択します。
Oracle Warehouse Builderにより、インポート・メタデータ・ウィザードのようこそページが表示されます。
「次へ」をクリックします。
「フィルタ情報」ページの「オブジェクト・タイプ」フィールドで、「PL/SQL変換」を選択してPL/SQL変換をOracleモジュールにインポート、または「変換」を選択してスカラー・ファンクションをIBM DB2 UDBまたはSQL Serverモジュールにインポートします。
「次へ」をクリックします。
インポート・メタデータ・ウィザードのオブジェクト選択ページが表示されます。
「使用可能なオブジェクト」リストから、ファンクション、プロシージャまたはパッケージを選択します。オブジェクトを「選択したオブジェクト」リストに移動する際、単一オブジェクトの移動には右矢印を、複数オブジェクトの移動には「すべて移動」ボタンをクリックします。
「次へ」をクリックします。
インポート・メタデータ・ウィザードのサマリーとインポート・ページが表示されます。
インポート情報を確認します。選択した内容を変更するには、「戻る」をクリックします。
「終了」をクリックして、選択したPL/SQL変換をインポートします。
Oracle Warehouse Builderで、インポート結果ページが表示されます。
「OK」をクリックしてインポートを続行します。インポート・プロセスを取り消すには、「元に戻す」をクリックします。
インポートしたPL/SQL情報が、データをインポートしたモジュールの「変換」ノードに表示されます。
シナリオ
ある映画レンタル会社では、CUST_RENTAL_ACTIVITY
表に定期的に顧客のレンタル状況を更新しており、この表には各顧客のレンタル売上および延滞料金データが格納されています。この表は様々なメーリング・キャンペーンに使用されます。たとえば、最新のメーリング・キャンペーンでは、高額な延滞料金のある顧客に対し、新しいペイパービュー・サービスを提供します。現在、この映画レンタル会社では、PL/SQLパッケージを使用して顧客のデータを一元化しています。既存のPL/SQLパッケージは、データベースにアクセスすることにより手動で保持する必要があります。このコードはOracle 8iデータベースで実行されます。
CREATE OR REPLACE PACKAGE RENTAL_ACTIVITY AS PROCEDURE REFRESH_ACTIVITY(SNAPSHOT_START_DATE IN DATE); END RENTAL_ACTIVITY; / CREATE OR REPLACE PACKAGE BODY RENTAL_ACTIVITY AS PROCEDURE REFRESH_ACTIVITY(SNAPSHOT_START_DATE IN DATE) IS CURSOR C_ACTIVITY IS SELECT CUST.CUSTOMER_NUMBER CUSTOMER_NUMBER, CUST.CUSTOMER_FIRST_NAME CUSTOMER_FIRST_NAME, CUST.CUSTOMER_LAST_NAME CUSTOMER_LAST_NAME, CUST.CUSTOMER_ADDRESS CUSTOMER_ADDRESS, CUST.CUSTOMER_CITY CUSTOMER_CITY, CUST.CUSTOMER_STATE CUSTOMER_STATE, CUST.CUSTOMER_ZIP_CODE CUSTOMER_ZIP_CODE, SUM(SALE.RENTAL_SALES) RENTAL_SALES, SUM(SALE.OVERDUE_FEES) OVERDUE_FEES FROM CUSTOMER CUST, MOVIE_RENTAL_RECORD SALE WHERE SALE.CUSTOMER_NUMBER = CUST.CUSTOMER_NUMBER AND SALE.RENTAL_RECORD_DATE >= SNAPSHOT_START_DATE GROUP BY CUST.CUSTOMER_NUMBER, CUST.CUSTOMER_FIRST_NAME, CUST.CUSTOMER_LAST_NAME, CUST.CUSTOMER_ADDRESS, CUST.CUSTOMER_CITY, CUST.CUSTOMER_STATE, CUST.CUSTOMER_ZIP_CODE; V_CUSTOMER_NUMBER NUMBER; V_CUSTOMER_FIRST_NAME VARCHAR2(20); V_CUSTOMER_LAST_NAME VARCHAR2(20); V_CUSTOMER_ADDRESS VARCHAR(50); V_CUSTOMER_CITY VARCHAR2(20); V_CUSTOMER_STATE VARCHAR2(20); V_CUSTOMER_ZIP_CODE VARCHAR(10); V_RENTAL_SALES NUMBER; V_OVERDUE_FEES NUMBER; BEGIN OPEN C_ACTIVITY; LOOP EXIT WHEN C_ACTIVITY%NOTFOUND; FETCH C_ACTIVITY INTO V_CUSTOMER_NUMBER, V_CUSTOMER_FIRST_NAME, V_CUSTOMER_LAST_NAME, V_CUSTOMER_ADDRESS, V_CUSTOMER_CITY, V_CUSTOMER_STATE, V_CUSTOMER_ZIP_CODE, V_RENTAL_SALES, V_OVERDUE_FEES; UPDATE CUST_ACTIVITY_SNAPSHOT SET CUSTOMER_FIRST_NAME = V_CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME = V_CUSTOMER_LAST_NAME, CUSTOMER_ADDRESS = V_CUSTOMER_ADDRESS, CUSTOMER_CITY = V_CUSTOMER_CITY, CUSTOMER_STATE = V_CUSTOMER_STATE, CUSTOMER_ZIP_CODE = V_CUSTOMER_ZIP_CODE, RENTAL_SALES = V_RENTAL_SALES, OVERDUE_FEES = V_OVERDUE_FEES, STATUS_UPDATE_DATE = SYSDATE WHERE CUSTOMER_NUMBER = V_CUSTOMER_NUMBER; IF SQL%NOTFOUND THEN INSERT INTO CUST_ACTIVITY_SNAPSHOT ( CUSTOMER_NUMBER, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, CUSTOMER_ADDRESS, CUSTOMER_CITY, CUSTOMER_STATE, CUSTOMER_ZIP_CODE, RENTAL_SALES, OVERDUE_FEES, STATUS_UPDATE_DATE ) VALUES ( V_CUSTOMER_NUMBER, V_CUSTOMER_FIRST_NAME, V_CUSTOMER_LAST_NAME, V_CUSTOMER_ADDRESS, V_CUSTOMER_CITY, V_CUSTOMER_STATE, V_CUSTOMER_ZIP_CODE, V_RENTAL_SALES, V_OVERDUE_FEES, SYSDATE ); END IF; END LOOP; END REFRESH_ACTIVITY; END RENTAL_ACTIVITY; /
解決策
この事例では、既存のカスタムPL/SQLパッケージをOracle Warehouse Builderにインポートする利点とPL/SQLコードの自動的な保持、更新および再生成を行う機能を使用する利点について説明します。Oracle Warehouse Builderによりデータベースの新機能を自動的に利用できるようになり、またデータベースの新規バージョン向けに最適化されたコードを生成することにより更新されます。たとえば、Oracle8i用のPL/SQLパッケージを持つ場合は、パッケージをOracle Warehouse BuilderにインポートすることによりOracle8i、Oracle9i、Oracle 10gまたはOracle 11gのコードを生成できます。
また、カスタム・パッケージをインポートしてOracle Warehouse Builderマッピングを介した操作を再作成することにより、操作を透過的に実行および監視できます。そうでない場合は、データベースに手動でアクセスしてコードを検証および更新する必要があります。またOracle Warehouse Builderでは、ランタイム監査ブラウザでコードの実行が監視されエラーが記録されている間に、すべてのETL操作に対して系統および影響分析を実行することも可能です。
事例
次の手順に従って、Oracle Warehouse BuilderにPL/SQLコードを移行できます。
手順2: ブラック・ボックス・マッピングの作成 Oracle Warehouse Builderマッピング内のカスタム変換を使用します。
手順3: カスタム・コードのマッピングへの再実装 レガシーPL/SQLコードを新規のOracle Warehouse Builderマッピングに再実装し、カスタム・パッケージを段階的に廃止します。
次の手順に従って、Oracle Warehouse Builder内のカスタムPL/SQLパッケージを処理します。
手順1: カスタムPL/SQLパッケージのインポート
プロジェクト・ナビゲータで、PL/SQLパッケージrefresh_activity(
DATE
)
をインポートする先のOracleモジュール内の「変換」ノードを開きます。インポート・メタデータ・ウィザードを使用して、「変換」を右クリック、「インポート」を選択、「データベース・オブジェクト」を選択してパッケージをインポートします。このウィザードのフィルタ情報ページで、PL/SQL変換をインポートしていることが示されます。
インポートの終了後、パッケージrefresh_activity(
DATE
)
が「変換」フォルダの「パッケージ」ノードの下に表示されます。
手順2: ブラック・ボックス・マッピングの作成
変更を加えることなく、refresh_activity(
DATE
)
プロシージャをマッピングで直接使用できます。マッピングでは、マッピング後プロセス演算子を、選択したパッケージrefresh_activity(
DATE
)
を使用するマッピングに追加します。
この例では、既存のカスタム・コードをすぐに利用できます。リソースに対する学習期間および投資は最小限に抑えられます。新規の処理単位を開発するためにのみOracle Warehouse Builderを使用して、この方法で既存および開発済のすべてのPL/SQLコードを保持するよう決定できます。Oracle Warehouse Builderにより、新規に作成するマッピングとレガシー・コードを使用するマッピングを使用できます。この場合、Oracle Warehouse Builderでこれらのマッピングのコードを生成できますが、Oracle Warehouse Builder機能を使用してコードの管理、更新または監査を行うことはできません。
レガシー・コードは、Oracle Warehouse Builderに対して透過的でないブラック・ボックスとして使用されるため、レガシー・コードを手動でメンテナンスする必要があります。したがって、Oracle Warehouse Builderによって生成されるマッピングで使用可能なインフラストラクチャ・コードおよびメタデータに依存するOracle Warehouse Builder機能(ランタイム監査ブラウザ、系統と影響分析、最適化コード生成など)を利用することはできません。
Oracle Warehouse Builderのこれらの機能を利用し、PL/SQLコードを自動的に保持、監視および生成するには、次の手順に従います。
手順3: カスタム・コードのマッピングへの再実装
コードの生成、保持および監査機能を利用するためには、マッピングを使用してレガシーPL/SQLコード機能を再実装し、カスタム・ブラック・ボックス・パッケージを段階的に廃止できます。PL/SQLコード機能を提供するために作成されたマッピングはRental_Activity
と呼ばれます。
ブラック・ボックス・マッピングと並行して新規マッピングを実行することでこの新規マッピングをテストする方法をお薦めします。テストが正常に終了し、新規マッピングでカスタム・コードを含むすべての操作を実行できる場合は、ブラック・ボックス・マッピングを段階的に廃止できます。Oracle Warehouse Builderでは、データベース内で手動更新を実行することなく、マッピングからのコードを保持、更新および生成できます。
図9-2は、Rental_Activity
マッピングから生成されたコードのサンプルを示しており、このマッピングにより映画レンタル会社用のカスタムPL/SQLパッケージの操作が複製されます。
手順4: Oracle Database 11g用のコードの生成
Oracle9iバージョンのデータベースにアップグレードする場合は、手順3で作成したRental_Activity
マッピングを再配布する必要があります。Oracle Warehouse Builderにより、新規のデータベース・バージョンに対して最適化されたコードが生成されます。
図9-3は、Oracle9iの同じマッピングに対して生成されたコードのサンプルからのMERGE
文を示しています。
新規コードの保持および生成には、手動の手順は必要ありません。また、手動の手順のETL操作を透過的に監視および保持できます。Oracle Warehouse Builderでは、手動の手順を使用してマッピングに対する系統および影響分析を実行でき、ランタイム監査ブラウザでは、手動の手順を使用してマッピングの実行中にエラーを追跡および記録できます。
Oracle Warehouse Builder 11gリリース2(11.2)から、Oracle以外のプラットフォーム内でも事前定義済ファンクションを作成、インポートおよび使用できます。今回のリリースでは、次のプラットフォームまでファンクションの使用が拡大されます。
DB2
SQL Server
Oracleモジュールの場合と同様、DB2モジュールおよびSQL Serverモジュールで新規ファンクションを作成できます。同様に、DB2またはSQL Serverデータベースから既存のファンクションをインポートすることもできます。グローバル・ナビゲータには事前定義済ファンクションも用意されています。
注意: ファンクションはプラットフォーム間でコピーおよび貼付けできません。たとえば、ファンクションをOracleモジュールからコピーして、SQL Serverモジュールに貼り付けることはできません。 |
グローバル・ナビゲータの「パブリック変換」ノードの「カスタム」ノードを使用してファンクションを定義すると、オブジェクトをOracle Databaseロケーションに配布する場合のみ使用できます。ただし、Oracle Warehouse Builderを使用してデータをSQL ServerおよびDB2の各データ・オブジェクトにもロードできます。この場合は、ユーザー定義ファンクションを作成してこれらのプラットフォーム用にデータを変換する必要があります。これらのデータベース用にファンクションを定義する場合は、プロジェクト・ナビゲータの「データベース」ノードを使用します。
DB2またはSQL Serverデータベースのファンクションを定義すると、それぞれ変換演算子および変換アクティビティを利用して、これらのファンクションをマッピングおよびプロセス・フローで使用できます。これらのファンクションをWebサービスとして公開することもできます。
IBM DB2またはSQL Serverファンクションの定義手順:
プロジェクト・ナビゲータで、「データベース」ノードを開きます。
ファンクションをDB2またはSQL Serverのいずれで作成するかに応じて、DB2またはSQL Serverノードを開きます。
「変換」ノードを開き、「ファンクション」ノードを右クリックして「新規ファンクション」を選択します。
「ファンクションの作成」ダイアログ・ボックスが表示されます。
ファンクションの名前とオプションで説明を入力し、「OK」をクリックします。
ファンクション・エディタが表示されます。
「パラメータ」タブに、次の情報を入力します。
戻り型: グローバル・ファンクションの戻り型のデータ型を選択します。
パラメータ: 各パラメータは「戻り型」フィールドの表の行別に表示されます。パラメータを作成するには、空のセルに名前を入力し、データ型やデフォルト値など、パラメータの詳細を入力します。「データ型」列のリストは、「プラットフォーム」フィールドで選択したプラットフォームに応じて入力されます。
注意: SQL Serverファンクションの場合、@は各パラメータ名の接頭辞として自動的に付けられます。 |
「実装」タブで、「パラメータ」タブで選択したプラットフォーム上でファンクションの実装に使用するコードを入力します。
「表示」メニューから、「コード・テンプレート」を選択します。
「ログ」ウィンドウに、「コード・テンプレート」タブが表示されます。
「コード・テンプレート」タブで、ファンクションのコード生成に使用するファンクションCTを選択します。
Oracle Warehouse Builderには、DB2およびSQL Serverの各データベース用のコードを生成する事前作成済ファンクションCTが用意されています。これらのファンクションCTは、パブリック・コード・テンプレート・フォルダのBUILT_IN_CTノードにあるグローバル・ナビゲータに格納されています。DB2の場合はDB2_FCTを、SQL Serverの場合はSQLSERVER_FCTを使用できます。
既存のファンクションはDB2およびSQL Serverデータベースからインポートできます。これは、Oracleファンクションのインポートに似ています。
DB2またはSQL Serverファンクションのインポート手順:
既存のDB2またはSQL Serverモジュールを右クリックし、「インポート」、「データベース・オブジェクト」を選択します。
インポート・メタデータ・ウィザードが表示されます。
「フィルタ情報」ページで、オブジェクト・タイプから「変換」を選択します。
「オブジェクト選択」ページで、必要なファンクションを選択し、「使用可能」フィールドから「選択済」フィールドに移動します。
サマリーページで情報を確認し、「終了」をクリックしてインポートを開始します。
インポートされたファンクションがプロジェクト・ナビゲータのモジュールに表示されます。
注意: Oracle Warehouse Builderでは過負荷DB2ファンクションをインポートできます。ただし、過負荷SQL Serverファンクションはインポートできません。 |
グローバル・ナビゲータの「パブリック変換」ノードにある「異機種」ノードには、Oracle、SQL ServerおよびDB2プラットフォームに使用できる事前定義済ファンクションが含まれています。
汎用異機種間ファンクションは、次のように分類されます。
文字
変換
日付
数値
その他
ファンクション定義とそれが定義されているプラットフォームを表示するには、前述のカテゴリのいずれかのファンクションをダブルクリックします。「名前」、「パラメータ」、「式」タブが含まれるファンクション・エディタが表示されます。「パラメータ」タブをクリックしてファンクション、ファンクション・パラメータおよびファンクション戻り型が定義されているプラットフォームを表示します。「式」タブをクリックし、SQL ファンクションに使用した式とファンクションを定義したプラットフォームを表示します。
指定された式、パラメータおよびパラメータのデータ型のセマンティクスの詳細は、特定のプラットフォームのドキュメントを参照してください。
ファンクションを定義したら、構成パネルを使用して構成パラメータを設定することで構成できます。
次の各項では、Oracleプラットフォームに対してOracle Warehouse Builderでサポートされている構成パラメータをリストします。
次の構成パラメータは、Oracleプラットフォーム上で定義されているファンクションに設定できます。
このパラメータは、ファンクションを実行する権限を指定します。次のいずれかのオプションを選択します。
CURRENT_USER: ファンクションは現在のユーザーの権限で、現在のユーザーのスキーマで実行されることを示します。名前解決の範囲が制限されます。Oracle Databaseは、現在のユーザーのスキーマの名前でファンクションを検索します。
DEFINER: ファンクションはファンクションが存在するスキーマの所有者に割り当てられた権限で実行されることを示します。すべての外部名は同じスキーマ内で解決されます。
ファンクションが確定的であることを示す場合はこのオプションを選択します。確定的ファンクションは、ファンクションが実行されるたびに指定された引数のセットに対して同じ結果を戻します。
このオプションは、ファンクション・コールが冗長になることを防ぐのに役立ちます。ストアド・ファンクションが以前に同じ引数でコールされている場合、前の結果を使用できます。ファンクションの結果は、セッション変数またはスキーマ・オブジェクトの状態に依存しません。そうでない場合、結果はコールによって異なります。ファンクションベースの索引またはクエリー・リライトが有効なマテリアライズド・ビューからコールすることができるのは、DETERMINISTICファンクションのみです。