3 OdiRef置換APIの概要

例を使用することにより、Oracle Data Integrator OdiRef Substitution APIの一般的な理解を得ることができます。

この章の内容は次のとおりです。

ノート:

置換APIメソッドは、置換APIリファレンスに一覧表示されています。

3.1 代替APIの概要

KMは、Oracle Data Integratorの代替APIを使用してテンプレートとして記述されます。APIメソッドは、文字列値、または文字列に変換可能なオブジェクト値あるいは別のメソッドにパラメータとして渡されるオブジェクト値を返すJavaメソッドです。ODIバージョン12.2.1.2.1からは、2つのタイプの置換APIオブジェクトがあります。

  • 1つ目のタイプは、構造化置換APIと呼ばれます。これは、生成されるコードの構造を表す、構造化されたオブジェクトのセットです。構造化置換APIオブジェクトは、一般的にツリーに似た構造によって関連付けられたオブジェクトのコレクションです。親オブジェクトから子オブジェクトにナビゲートするためのナビゲーション方法が用意されています。構造化置換APIは、IKM、LKM、XKMおよびCKMで構成される、コンポーネントKMのコマンドまたはグローバル・テンプレートを記述する場合にのみ使用可能です。

  • ASTオブジェクトの2つめのタイプはモノリシック置換API、またはodiRef (ODIバージョン12.2.1.2.1より前に使用できた唯一の置換APIオブジェクト)です。

構造化置換API

構造化置換APIツリーは、KMによって生成されるコードのベース言語によって構造が異なります。現在サポートされているベース言語は、SQL、SPARK_PYTHONです。

次の図に、SQLのツリー構造を示します。

同じメソッドでも、ツリーの生成に使用されたマッピング・ロジックの構造に応じて異なる値を返すことがあります。ツリーは、マッピング内の特定のターゲットについてすべてのソース・コンポーネントを反復し、各コンポーネントKMに対してKM委譲を実行することによって生成されます。

次の例では、構造化置換APIを使用してKMにcreate table文を記述する方法を示します。

次のコードはKMまたはグローバル・テンプレートに入力されます。

CREATE TABLE $[tableName] ({#LIST} $[tgtColNameList] $[tgtColDataTypeList] {#SEP#},{#NL#} {#ENDLIST#})

PRODUCT表に対して生成されたコードは次のとおりです。

CREATE TABLE db_staging.PRODUCT( PRODUCT_ID numeric(10), PRODUCT_NAME varchar(250), FAMILY_ID numeric(4), SKU varchar(13), LAST_DATE timestamp)

CUSTOMER表に対して生成されたコードは次のとおりです。

CREATE TABLE db_staging.CUSTOMER( CUST_ID numeric(10), CUST_NAME varchar(250), ADDRESS varchar(250), CITY varchar(50), ZIP_CODE varchar(12), COUNTRY_ID varchar(3))

次に、テンプレートの各要素について説明します。

  • CREATE TABLEは、生成コードに複製される単純テキストです。

  • $[tableName]は、groovyベースのテンプレート構文(12.2.1.2.1以降)を使用した置換APIコールです。$[…]エスケープ文字内の名前は、組込みまたはgroovy変数の単純な変数名にするか、"table.getName()"などのメソッド・コールを含めることができます("table"変数がgetName()メソッドを使用したオブジェクトであった場合)。tableName変数はKMタスクと関連付けられている変数定義groovyスクリプトに定義されています。

  • {#LIST#}は、テンプレート・フロー制御コマンド構文(ODI 12.2.1.2.1以降)の例です。これらのコマンドは常に{#...#}でエスケープされ、テキスト生成のフローの制御で使用できます。この場合、リスト内の各オブジェクトに対して"toString()"をコールすることで、リスト変数を表示できます。{#LIST#}コマンドについて、各リスト・アイテムに対して異なるメソッドをコールする必要がある場合は、"foreach()"構文を使用します(例: "columnList.foreach(getText())")。{#LIST#}に続くリスト置換APIオブジェクトは1つずつ展開され、それぞれに固定テキストが使用されます。

  • {#SEP#}は、常に{#LIST#}とペアになる別のテンプレート・フロー制御コマンドです。このコマンドに続くテキストは、各リスト・アイテム間のセパレータとして使用されます。

  • {#ENDLIST#}コマンドは、リスト・フロー制御定義を閉じます。

モノリシック置換APIオブジェクト - odiRef

モノリシック置換APIメソッドは、"odiRef"という名前の単一のオブジェクト・インスタンスに属します。同じメソッドでもそれを起動するKMのタイプに応じて異なる値を返すことがあります。この理由により、それらはKMのタイプによって分類されます。

このAPIの動作方法を理解できるように、次の例では、KMでのCREATE TABLE文の記述方法、および関連するデータストアに応じて生成されるコードについて説明します。

次のコードがKMに入力されます。

CREATE TABLE <%=odiRef.getTable("L", "INT_NAME", "A")%>(<%=odiRef.getColList("", "\t[COL_NAME] [DEST_CRE_DT]", ",\n", "", "")%>)

PRODUCT表に対して生成されたコードは次のとおりです。

CREATE TABLE db_staging.I$_PRODUCT(
	P	RODUCT_ID numeric(10),	PRODUCT_NAME varchar(250),	FAMILY_ID numeric(4),	SKU varchar(13),	LAST_DATE timestamp)

CUSTOMER表に対して生成されたコードは次のとおりです。

CREATE TABLE db_staging.I$_CUSTOMER(	CUST_ID numeric(10),	CUST_NAME varchar(250),	ADDRESS varchar(250),	CITY varchar(50),	ZIP_CODE varchar(12),	COUNTRY_ID varchar(3))

適切なメタデータを使用してKM を実行した結果、商品および顧客の表に対して異なるコードが生成されたことがわかります。

次の各トピックでは、主要な代替API の一部について説明し、KM 内での使用方法を説明します。読みやすくするために、例ではタグ<% と%>、およびodiRefオブジェクト参照は省略しています。

odiRef置換APIメソッドへのコールは、KMタスクのgroovy変数定義スクリプトに作成することもできます。そのため、odiRefコールまたはいくつかのコールの組合せの結果と値が等しい、新しい変数を定義できます。

3.2 置換メソッドの使用

ナレッジ・モジュールとプロシージャからアクセス可能なメソッドは、Javaで実装されているOracle Data Integratorのメソッドのダイレクト・コールです。これらのメソッドは通常、Oracle Data Integratorリポジトリに格納されているメタデータに対応するテキストの生成に使用されます。

3.2.1 一般構文

置換メソッドは、ナレッジ・モジュールまたはプロシージャのタスクの任意のテキストで使用されます。

odiRefメソッドは、groovy変数定義スクリプトの内部でコールできます。また、次の構文を使用して、任意のKMタスク・コマンド内で使用することもできます。

<%=java_expression%>

この構文の説明は次のとおりです。

  • <%= %>タグは、java_expressionで返されるテキストの出力に使用されます。この構文は、Java Server Pages (JSP)で使用される構文とほぼ同じです。

  • Java expressionは、文字列を返す任意のJava式です。

次の構文は、3つのパラメータを使用してodiRef javaオブジェクトのgetTableメソッドのコールを実行します。このメソッドのコールは文字列を返します。それがCREATE TABLEテキストの後に書き込まれます。

CREATE TABLE <%=odiRef.getTable("L", "INT_NAME", "A")%>

Oracle Data Integratorのモノリシック置換APIは、JavaクラスOdiReferenceに実装されており、そのインスタンスOdiRefはいつでも使用できます。たとえば、getFrom()メソッドをコールするには、odiRef.getFrom()と記述する必要があります。

ノート:

下位互換性のために、odiRef APIはsnpRef APIとして参照することもできます。snpRefおよびodiRefオブジェクトのインスタンスは同義語で、前の構文snpRef.<method_name>はまだサポートされていますが、非推奨です。

3.2.2 CKM固有の構文

次の構文は、チェック・プロシージャ(CKM)の実行をコールするために、IKMで使用されます。

この構文は、処理のこの段階で、すべてのCKMプロシージャ・コマンドを自動的に含めます。

<% @ INCLUDE (CKM_FLOW | CKM_STATIC) [DELETE_ERROR] %>

この構文のオプションは次のとおりです。

  • CKM_FLOW: フロー制御をトリガーします。マッピングの物理ダイアグラムにある、ターゲット・データストアのプロパティの「チェック・ナレッジ・モジュール」タブでのCKMの選択内容に従ってトリガーされます。

  • CKM_STATIC: ターゲット・データストアの静的管理をトリガーします。データストアに対して静的な制約として定義および選択された制約がチェックされます。

  • DELETE_ERROR: このオプションは、検出されたエラーを検証済の表(CKM_FLOWの場合はフロー表、CKM_STATICの場合はターゲット表)から削除するようにCKMに指示します。より正確には、すべてのCKMコマンドがRemove Errorsというタグ付きで生成されます。

例: 次のコールはエラー検出によるフロー制御をトリガーします。

<% @ INCLUDE  CKM_FLOW DELETE_ERROR %>

3.2.3 フレックスフィールドの使用

フレックスフィールドは、Oracle Data Integratorのオブジェクトのプロパティをユーザーがカスタマイズできるようにするユーザー定義フィールドです。フレックスフィールドは「オブジェクト」ウィンドウの「フレックスフィールド」タブで定義され、「オブジェクト」ウィンドウの「フレックスフィールド」タブを使用して各オブジェクト・インスタンスに対して設定できます。

Groovyベース変数とマッピングAPIを使用したフレックスフィールド・アクセス

新しい構造化置換APIを使用すると、組込みコンポーネントKM変数"physicalNode"で開始しODIパブリックAPIを使用して値にナビゲートすることによって、データストアのフレックスフィールド値を取得できます。これは、次のようなgroovy言語(javaと同様の記述方法)を使用したgroovy変数定義スクリプトで実行できます。

flexFieldValue = “”;
String ffName = “MY_FLEX_FIELD”;
IMapComponent comp = node.getLogicalComponent();
if (comp.isOfType(DatastoreComponent.COMPONENT_TYPE_NAME)) {
  DatastoreComponent datastoreComp = (DatastoreComponent) comp.getDelegate();
  OdiDataStore datastore = (OdiDataStore) datastoreComp.getBoundDataStore();
  Collection<IFlexFieldValue> ffValues = datastore.getFlexFieldsValues();
for (IFlexFieldValue value : ffValues) {
if (value.getName().equals(ffName)) {
   // found it
   flexFieldValue = value.getValue().toString();
    }
   

このコードがgroovy変数定義スクリプトに記述されている場合は、テンプレートまたはKMコマンドの変数参照で変数"flexFieldValue"を使用できます。

このコードは、単純なodiRef getTableまたはgetSrcTableListコールより複雑です(次の例を参照)。ただし、特定のオブジェクトから配列にすべてのフレックスフィールドを取得したり、他のオブジェクトやコンテキスト・ターゲットまたはソース表からフレックスフィールドを取得するような、特殊なケースに対応できる柔軟性があります。

また、KMタスクのgroovy変数定義スクリプトでodiRefコールを使用して一時変数に値を保存し、これをテンプレート・コマンドで使用することもできます。

モノリシックodiRef置換APIを使用したフレックスフィールド・アクセス

Oracle Data Integratorの置換メソッドを使用してオブジェクト・プロパティにアクセスする場合、フレックスフィールドのコードを指定すると、Oracle Data Integratorは、そのコードをオブジェクト・インスタンスのフレックスフィールド値で置き換えます。

たとえば、次のようになります。

<%=odiRef.getTable("L", "MY_DATASTORE_FIELD", "W")%>の場合、現在の表のフレックスフィールドMY_DATASTORE_FIELDの値が返されます。

<%=odiRef.getSrcTableList("", "[MY_DATASTORE_FIELD] ", ", ", "")%>の場合、マッピングの各ソース表のフレックスフィールド値が返されます。

フレックスフィールド値は、getFlexFieldValue()メソッドを使用して取得することもできます。

ノート:

フレックスフィールドは特定のオブジェクト・タイプにのみ存在します。「フレックスフィールド」タブのないオブジェクトではサポートされていません。

3.2.4 コード生成タグの使用

次のコード生成タグは、テンプレート内に実行可能javaを記述するために使用できます。

  • <%... %>: このタグは、シナリオ生成時またはセッション作成時に評価されます。テキスト内のメタデータ情報を置換するために使用されます。PRODUCT表の例を次に示します。

    CREATE TABLE <%=odiRef.getTable("L", "INT_NAME", "A")%>
    

    これは次のように変換されます。

    CREATE TABLE db_staging.I$_PRODUCT
    

    新しいコンポーネントKM (IKM/LKM/XKM/CKM)に<%...%>タグを使用することはお薦めしません。かわりに、新しい構造化置換APIとgroovy変数定義スクリプトを使用してください。

  • <?...?>: このタグはセッション実行時に評価され、実行コンテキストに基づいて物理トポロジ情報が置換されます。このタグの評価後に、セッション・タスク・ログが作成されます。ターゲット・データ・サーバー・ユーザー'TargetName'の例を次に示します。

    "<?=snpRef.getInfo("DEST_USER_NAME")?>"
    

    これは次のように変換されます。

    'TargetName'
    
  • <@...@>: このタグはセッション・ログの作成後に評価されるため、セッション・タスク・ログに含めない置換に対して使用する必要があります。セキュリティ上の理由でセッション・タスク・ログに記録されないようにするクリア・テキスト・パスワードを置換する場合に使用できます。次に例を示します。

    <@=snpRef.getInfo("SRC_PASS") @> 
    

3.3 アクションでの置換メソッドの使用

アクションはDDL操作(表の作成、参照の削除など)に対応しています。この操作を使用して、Data Integratorモデルで実行する変更をデータベースに実装するためのセッションまたはシナリオ・タスクを生成します(DDLの生成操作)。各アクションには、DDL操作を実行するために必要なコマンドに対応する、いくつかのアクション行が含まれます(たとえば、表を削除するには、先にその制約をすべて削除する必要があります)。

3.3.1 アクション行のコード

アクション行には、アクション・グループのテクノロジで有効な文が含まれます。プロシージャやナレッジ・モジュール・コマンドと異なり、これらの文は1つの接続を使用します(SELECT ... INSERT文は使用できません)。ナレッジ・モジュールのスタイルでは、アクションは置換メソッドを使用してDDLコードを汎用にします。

たとえば、アクション行に、表のチェック制約を削除するための次のコードが含まれることがあります。

ALTER TABLE $[tableName]
DROP CONSTRAINT $[constraintName]

3.3.2 アクション・コール・メソッド

アクション・コール・メソッドは、アクション行でのみ使用できるodiRefコールです。他の置換メソッドと異なり、テキストの生成には使用されず、コンテキストに適切なアクションを生成するために使用されます。

たとえば、Drop Table DDL操作を実行するためには、まず表を参照している外部キーをすべて削除する必要があります。

表の削除アクションでは、最初のアクション行はdropReferringFKs()アクション・コール・メソッドを使用して、現在の表の各外部キーについて外部キーの削除アクションを自動的に生成します。このコールは、次のコードでアクション行を作成することによって実行されます。

<% odiRef.dropReferringFKs(); %>

アクション・コール・メソッドをコールするための構文は次のとおりです。

<% odiRef.method_name(); %>

ノート:

アクション・コール・メソッドは、アクション行1行に1つのみにする必要があります。=記号を前に付けずにコールしてください。また、最後にセミコロンが必要です。

アクションでは、次のアクション・コール・メソッドを使用できます。

  • addAKs(): 現在の表のすべての代替キーに対して、代替キーの追加アクションをコールします。

  • dropAKs(): 現在の表のすべての代替キーに対して、代替キーの削除アクションをコールします。

  • addPK(): 現在の表の主キーに対して、主キーの追加アクションをコールします。

  • dropPK(): 現在の表の主キーに対して、主キーの削除アクションをコールします。

  • createTable(): 現在の表に対して表の作成アクションをコールします。

  • dropTable(): 現在の表に対して表の削除アクションをコールします。

  • addFKs(): 現在の表のすべての外部キーに対して、外部キーの追加アクションをコールします。

  • dropFKs(): 現在の表のすべての外部キーに対して、外部キーの削除アクションをコールします。

  • enableFKs(): 現在の表のすべての外部キーに対して、外部キーの有効化アクションをコールします。

  • disableFKs(): 現在の表のすべての外部キーに対して、外部キーの無効化アクションをコールします。

  • addReferringFKs(): 現在の表を参照しているすべての外部キーに対して、外部キーの追加アクションをコールします。

  • dropReferringFKs(): 現在の表を参照しているすべての外部キーに対して、外部キーの削除アクションをコールします。

  • enableReferringFKs(): 現在の表を参照しているすべての外部キーに対して、外部キーの有効化アクションをコールします。

  • disableReferringFKs(): 現在の表を参照しているすべての外部キーに対して、外部キーの無効化アクションをコールします。

  • addChecks(): 現在の表のすべてのチェック制約に対して、チェック制約の追加アクションをコールします。

  • dropChecks(): 現在の表のすべてのチェック制約に対して、チェック制約の削除アクションをコールします。

  • addIndexes(): 現在の表のすべての索引に対して、索引の追加アクションをコールします。

  • dropIndexes(): 現在の表のすべての索引に対して、索引の削除アクションをコールします。

  • modifyTableComment(): 現在の表に対して表のコメントの変更をコールします。

  • AddColumnsComment(): 現在の表のすべての列に対して列のコメントの変更をコールします。

3.4 オブジェクト名の使用

デザイナで作業する場合、実行コンテキストによって変化するデータベース名やスキーマ名などの物理情報は指定しないようにする必要があります。正しい物理情報は、実行時にOracle Data Integratorによって提供されます。

代替APIには、実行時のコンテキストを考慮してオブジェクトまたはデータストアの完全修飾名を算出するメソッドが備わっています。これらのメソッドを次の表に示します。

odiRefの計算の名前付けメソッドは、groovy変数定義スクリプトまたはコマンドテキスト内の<%...%>などのjavaタグ内部からコールできます。

必要な完全修飾名 メソッド 次で使用可能

OBJ_NAMEという名前のすべてのオブジェクト

getObjectName("L", "OBJ_NAME", "D")

すべて

現在のマッピングのターゲット・データストア

getTable("L", "TARG_NAME", "A")

LKM、CKM、IKM、JKM

現在のマッピングの統合(I$)表

getTable("L", "INT_NAME", "A")

LKM、IKM

現在のロード・フェーズのロード表(C$)

getTable("L", "COLL_NAME", "A")

LKM

チェックされたデータストアのエラー表(E$)

getTable("L", "ERR_NAME", "A")

LKM、CKM、IKM

チェックされたデータストア

getTable("L", "CT_NAME", "A")

CKM

外部キーによって参照されるデータストア

getTable("L", "FK_PK_TABLE_NAME", "A")

CKM

さらに、groovyスクリプトでマッピング・パブリックAPIが使用され、マップ物理ノードが使用可能である場合に対応して、特殊な静的オブジェクト名の取得メソッドが用意されています。これは、現在のターゲット以外のオブジェクトに、生成されたオブジェクト名が必要な場合に便利です。

表3-1 静的オブジェクト名の取得メソッド

必要な完全修飾名 メソッド 次で使用可能

OBJ_NAMEという名前のすべてのオブジェクト

OdiRef.getOdiGeneratedAccessName("OBJ_NAME", mapPhysicalNode, "D")

すべて

3.5 表、列および式のリストの使用

多くの場合、項目のリストからコードを生成するには、whileループまたはforループが必要になります。Oracle Data Integratorは、一連のテンプレート・フロー制御コマンドを提供することでこの問題に対応しています。これらのコマンドは、テンプレート・パターンのリスト変数のセットとセパレータのパターンを指定することで、イテレータとして動作します。

ループ動作の主なテンプレート・フロー制御コマンドは、{# LIST #}です。{#LIST#}コマンドと{#ENDLIST#}コマンドの間にあるテンプレート・パターンは、複数回展開されます(テンプレート・パターンで展開されるリスト変数のアイテムごとに1回)。リスト構造の内部には、テンプレート・パターンで展開される少なくとも1つのリスト変数が存在している必要があります。

たとえば、groovyにリスト変数が次のように定義されていた場合、

List myList = [‘a’. ‘b’, ‘c’]

#LISTコマンドを次のように追加します。

{#LIST#} The element value is $[myList] {#SEP#} {#NL#} {#ENDLIST#}

結果として生成されるコードは次のようになります。

The element value is a
The element value is b
The element value is c

{#SEP#}と{#ENDLIST#}の間にあるテンプレート・パターンは、各リスト・アイテムの展開間のセパレータとして使用されます。

パターンには複数のリスト変数を使用できますが、それぞれの要素数が同じである必要があります。

マッピング・オブジェクトとその生成文字列にアクセスするには、groovy変数定義スクリプトで構造化置換APIまたはマッピングAPIを使用します。たとえば、次の問合せを使用して、組込みQUERY構造化置換API変数の生成されたソース列リストを取得できます。

{# LIST #} $[QUERY.getSelectList().foreach(getText())] $[QUERY.getColumnAliasSeparator()] $[QUERY.getAliasList()] {# SEP #},{#NL#}{# ENDLIST #}

古いodiRefイテレータ・メソッドも引き続きサポートされ、Javaベースの<%...%>タグの中またはKMタスクのgroovy変数定義スクリプトで使用できます。これらのメソッドはイテレータとして機能します。代替マスクまたはパターンおよびセパレータを提供すると、メソッドによって、すべての解決済パターンがセパレータで区切られた単一の文字列が戻されます。

すべてのメソッドは1つの文字列を戻し、少なくとも次の4つのパラメータを受け入れます。

  • 開始: 作成される文字列を開始するための文字列。

  • パターン: リストの各項目の値にバインドされる属性を使用した代替マスク。

  • セパレータ: 置き換えられた各パターンと後続のパターンを区切るための文字列。

  • 終了: 作成される文字列の最後に追加される文字列。

一部のメソッドは、リストの一部の項目のみを取得するためのフィルタとして機能する、追加のパラメータ(セレクタ)を受け入れます。たとえば、マッピングのターゲット・データストアのマップされた属性のみをリストする場合です。

これらのメソッドの一部について、次の表に要約を示します。

メソッド 説明 次で使用可能

getColList()

Oracle Data Integratorで最も頻繁に使用されるメソッドです。使用されたコンテキスト内で実行する必要がある列および式のリストを返します。たとえば、次のようなリストの生成に使用できます。

  • CREATE TABLE文内の列

  • 更新キーの列

  • LKM、CKMまたはIKM内のSELECT文の式

  • ロード・スクリプトのフィールド定義

このメソッドでは、5番目のパラメータとしてセレクタが受け入れられるため、必要に応じて項目をフィルタ処理できます。

LKM、CKM、IKM、JKM、SKM

getTargetColList()

ターゲット・データストアの属性のリストを返します。

このメソッドでは、5番目のパラメータとしてセレクタが受け入れられるため、必要に応じて項目をフィルタ処理できます。

LKM、CKM、IKM、JKM、SKM

getAKColList()

代替キー用に定義された列のリストを返します。

CKM、SKM

getPKColList()

主キーの列のリストを返します。かわりに、セレクタ・パラメータをPKに設定してgetColListを使用することもできます。

CKM、SKM

getFKColList()

現在の外部キーの、参照する列および参照される列のリストを返します。

CKM、SKM

getSrcTablesList()

マッピングのソース表のリストを返します。できるかぎり、getFromメソッドをかわりに使用してください。getFromメソッドについては後述します。

LKM、IKM

getFilterList()

マッピングのフィルタ式のリストを返します。通常はgetFilterメソッドの方が適しています。

LKM、IKM

getJoinList()

マッピングの結合式のリストを返します。通常はgetJoinメソッドの方が適しています。

LKM、IKM

getGrpByList()

マッピングのマッピングで集計関数が検出されると、GROUP BY句に表示される式のリストを返します。通常はgetGrpByメソッドの方が適しています。

LKM、IKM

getHavingList()

マッピングのフィルタで集計関数が検出されると、HAVING句に表示される式のリストを返します。通常はgetHavingメソッドの方が適しています。

LKM、IKM

getSubscriberList()

サブスクライバのリストを返します。

JKM

次の項では、これらのメソッドを使用したコードの生成方法を示します。

3.5.1 INSERT.getTargetColListを使用した表の作成

次の例では、組込み変数INSERT(タイプSqlInsertStatement)を使用して表を作成する方法を示します。

KMコード

create table $[odiRuntimeAccessName]
(
  $[tgtColList.call()]
)
Combined with the following groovy variable definitions in the KM task variable definition script:
tableName = physicalNode.getBoundObjectName();
tableCmp = physicalNode.getLogicalComponent();
tableQualifier = physicalNode.getLocation() == null ? null : physicalNode.getLocation().getName();
odiRuntimeAccessName = OdiRef.getOdiGeneratedAccessName("TARG_NAME", physicalNode, "A");
tableAlias = component.getAlias();
tgtColList = { 
  def cols = component.getAttributes();
  String result = ""
  def first = true
  for (col in cols) {
    if (!first) result += ",\n"
    result += col.getSQLAccessName(false, "") + " " + MappingUtils.getDdlDataType(col.getBoundObject());
    first = false
  }
  return result
}

次の文を生成します。

Create table MYTABLE
(
   	CUST_ID numeric(10),
   CUST_NAME varchar(250),
   ADDRESS varchar(250),
   CITY varchar(50),
   ZIP_CODE varchar(12),
   COUNTRY_ID varchar(3)
)

3.5.2 getTargetColListを使用した表の作成

次の例は、列リストを使用して表を作成する方法を示しています。

KMコード

Create table MYTABLE
<%=odiRef.getTargetColList("(\n", "\t[COL_NAME] [DEST_WRI_DT]", ",\n", "\n)")%>

次の文を生成します。

Create table MYTABLE
(
   	CUST_ID numeric(10),
   CUST_NAME varchar(250),
   ADDRESS varchar(250),
   CITY varchar(50),
   ZIP_CODE varchar(12),
   COUNTRY_ID varchar(3)
)

この例では、次のようになります。

  • 開始は"(\n"に設定されています。生成されるコードはカッコで始まり、その後に改行(\n)が続きます。

  • パターンは"\t[COL_NAME] [DEST_WRI_DT]"に設定されています。生成されるコードは、各ターゲット列に対してループ処理を行い、タブ文字(\t)、列名([COL_NAME])、空白および変換先の書込み可能データ型([DEST_WRI_DT])の順に生成します。

  • セパレータは",\n"に設定されています。生成される各パターンはカンマ(,)および改行(\n)によって後続のパターンと区切られます。

  • 終了は"\n)"に設定されています。生成されるコードは改行(\n)およびその後に続くカッコで終わります。

3.5.3 getColListを使用したINSERT VALUES文

次の例は、列リストを使用して表に値を挿入する方法を示しています。

次のKMコードの場合:

insert into MYTABLE
(
<%=odiRef.getColList("", "[COL_NAME]", ", ", "\n", "INS AND NOT TARG")%>
<%=odiRef.getColList(",", "[COL_NAME]", ", ", "", "INS AND TARG")%>
)
Values
(
<%=odiRef.getColList("", ":[COL_NAME]", ", ", "\n", "INS AND NOT TARG")%>
<%=odiRef.getColList(", ", "[EXPRESSION]", ", ", "", "INS AND TARG")%>
)

次の文を生成します。

insert into MYTABLE
(
CUST_ID, CUST_NAME, ADDRESS, CITY, COUNTRY_ID
, ZIP_CODE, LAST_UPDATE
)
Values
(
:CUST_ID, :CUST_NAME, :ADDRESS, :CITY, :COUNTRY_ID
, 'ZZ2345', current_timestamp
)

この例では、MYTABLEに挿入する必要がある値は、ターゲット列と同じ名前のバインド変数または定数式(ターゲット上で実行される場合)のどちらかです。これらの2つの異なる項目セットを取得するために、セレクタ・パラメータを使用してリストが分割されています。

  • "INS AND NOT TARG": まず、文の"value"部分にあるバインド変数(:[COL_NAME])にマップされる、カンマ区切りの列のリスト([COL_NAME])を生成します。INSERT文に含めるフラグが設定されており、ターゲット上で実行されない列のみを取得するようにフィルタ処理します。

  • "INS AND TARG": 次に、INSERT文に含めるフラグが設定されており、ターゲット上で実行される式([EXPRESSION])に対応する、カンマ区切りの列のリスト([COL_NAME])を生成します。項目が1つでも検出された場合、リストの開始文字はカンマになります。

3.5.4 getSrcTableListの使用

次の例では、ログ目的でマッピングのソース表のリストを連結しています。

次のKMコードの場合:

insert into MYLOGTABLE
(
MAPPING_NAME,
DATE_LOADED,
SOURCE_TABLES
)
values
(
'<%=odiRef.getPop("POP_NAME")%>',
current_date,
'' <%=odiRef.getSrcTablesList("|| ", "'[RES_NAME]'", " || ',' || ", "")%>
)

次の文を生成します。

insert into MYLOGTABLE
(
MAPPING_NAME,
DATE_LOADED,
SOURCE_TABLES
)
values
(
'Int. CUSTOMER',
current_date,
'' || 'SRC_CUST' || ',' || 'AGE_RANGE_FILE' || ',' || 'C$0_CUSTOMER'
)

この例では、getSrcTableListによって、マッピングのソースとして使用されるリソース名のリストを含むメッセージが生成されます。このリストはMYLOGTABLEに追加されます。使用されるセパレータは、連結演算子(||)、引用符で囲まれたカンマ(',')、再び同じ連結演算子の順序で構成されます。表のリストが空の場合は、MYLOGTABLEのSOURCE_TABLES列が空の文字列('')にマップされます。

3.6 ソースのSELECT文の生成

LKMおよびIKMは、両方ともソースの結果セットを操作します。LKMの結果セットは、ソース上で実行する必要があるマッピング、フィルタ処理および結合に従って事前変換されたレコードを表します。一方、IKMの結果セットは、ステージング領域で実行されるマッピング、フィルタ処理および結合と一致する変換レコードを表します。

これらの結果セットを作成するには、通常はKMでSELECT文を使用します。Oracle Data Integratorには、このコードを生成するための高度な置換メソッド(getColListを含む)が用意されています。

メソッド 説明 次で使用可能

getFrom()

適切なソース表、左側外部結合、右側外部結合および完全外部結合を含む、SELECT文のFROM句を返します。このメソッドでは、トポロジからの情報を使用して、ソースまたはターゲットのテクノロジのSQL機能を判別します。テクノロジでサポートされている場合、FROM句は、適切なキーワード(INNER、LEFTなど)およびカッコを使用して適宜作成されます。

  • LKMで使用した場合、ソース・サーバーによって実行される必要があるFROM句が返されます。

  • IKMで使用した場合、ステージング領域サーバーによって実行される必要があるFROM句が返されます。

LKM、IKM

getFilter()

AND演算子で区切られたフィルタ式を返します。

  • LKMで使用した場合、ソース・サーバーによって実行される必要があるFILTER句が返されます。

  • IKMで使用した場合、ステージング領域サーバーによって実行される必要があるFILTER句が返されます。

LKM、IKM

getJrnFilter()

ジャーナル化されたソース・データストア用の特別なジャーナル・フィルタ式を返します。このメソッドは、CDCフレームワークとともに使用する必要があります。

LKM、IKM

getGrpBy()

マッピングで集計関数が検出されると、GROUP BY句を返します。

GROUP BY句には、集計関数を含まない列を参照するすべてのマッピング式が含まれます。集計関数のリストは、トポロジに含まれるテクノロジの言語によって定義されます。

LKM、IKM

getHaving()

フィルタで集計関数が検出されると、HAVING句を返します。

HAVING句には、集計関数を含むすべてのフィルタ式が含まれます。集計関数のリストは、トポロジに含まれるテクノロジの言語によって定義されます。

LKM、IKM

任意のSQL RDBMSソース・サーバーから結果セットを取得するには、次のSELECT文をLKMで使用します。

select <%=odiRef.getPop("DISTINCT_ROWS")%>
<%=odiRef.getColList("", "[EXPRESSION]\t[ALIAS_SEP] [CX_COL_NAME]", ",\n\t", "", "")%>
from <%=odiRef.getFrom()%>
where (1=1)
<%=odiRef.getFilter()%>
<%=odiRef.getJrnFilter()%>
<%=odiRef.getJoin()%>
<%=odiRef.getGrpBy()%>
<%=odiRef.getHaving()%>

最終フロー・データを作成するために、任意のSQL RDBMSステージング領域サーバーから結果セットを取得するには、次のSELECT文をIKMで使用します。ターゲット上で実行されず、書込み可能な列にマップされている式のみを取得するために、getColListはフィルタ処理されています。

select <%=odiRef.getPop("DISTINCT_ROWS")%>
<%=odiRef.getColList("", "[EXPRESSION]", ",\n\t", "", "(not TRG) and REW")%>
from <%=odiRef.getFrom()%>
where (1=1)
<%=odiRef.getJoin()%>
<%=odiRef.getFilter()%>
<%=odiRef.getJrnFilter()%>
<%=odiRef.getGrpBy()%>
<%=odiRef.getHaving()%>

すべてのフィルタおよび結合はANDで始まり、SELECT文のWHERE句は常にtrue (1=1)の条件で始まります。

3.7 APIによるその他の情報の取得

次に示すメソッドは、有用な追加情報を提供します。

メソッド 説明 次で使用可能

getInfo()

ソース・サーバーまたはターゲット・サーバーに関する情報を返します。

任意のプロシージャまたはKM

getSession()

現在実行中のセッションに関する情報を返します。

任意のプロシージャまたはKM

getOption()

特定のオプションの値を返します。

任意のプロシージャまたはKM

getFlexFieldValue()

フレックス・フィールド値に関する情報を返します。フレックス・フィールドの値は、リスト・メソッドを使用してパターン・パラメータの一部に指定できます。

任意のプロシージャまたはKM

getJrnInfo()

CDCフレームワークに関する情報を返します。

JKM、LKM、IKM

getTargetTable()

マッピングのターゲット表に関する情報を返します。

LKM、IKM、CKM

getModel()

リバースエンジニアリングの処理中に現在のモデルに関する情報を返します。

RKM

getPop()

現在のマッピングに関する情報を返します。

LKM、IKM

3.8 コード生成の高度な技術

Oracle Data Integratorでのコード生成は、<%および%>のタグで囲んだすべてのJavaコードを解釈できます。

ただし、ODIバージョン12.2.1.2.1以降で開発された新しいKMのベスト・プラクティスとしては、Javaまたはgroovyコードを、KMタスクのgroovy変数定義スクリプトに追加して、テンプレート・コマンドで使用できる単純な変数のセットを定義することによって、テンプレートとは別に保持します。たとえば、ある複雑な条件に従ってテンプレート・コマンドの一部のセクションを条件付きで生成する場合のベスト・プラクティスは、groovy変数スクリプトにブール変数を定義し、その変数をテンプレート・コマンドの{#IF#}文で使用することです。このようにすると、テンプレートとコードは別々に保持され、両方がより明確になります。

次に示す例は、これらの高度な技術の使用方法を説明しています。

Java変数およびString関数の使用

次のKMコードは、String変数を作成し、それを置換メソッドのコールで使用します。

<%
String myTableName;
myTableName = "ABCDEF";
%>
drop table <%=odiRef.getObjectName(myTableName.toLowerCase())%>

次を生成します。

drop table SCOTT.abcdef

KMオプションを使用した条件付きのコード生成

次のKMコードは、OPT001オプション値に応じてコードを生成します。

<%
String myOptionValue=odiRef.getOption("OPT001");
if (myOption.equals("TRUE"))
{
out.print("/* Option OPT001 is set to TRUE */");
}
else
{
%>
/* The OPT001 option is not properly set */
<%
}
%>

OPT001がTRUEに設定された場合は、次が生成されます。

/* Option OPT001 is set to TRUE */

その他の場合は、次が生成されます。

/* The OPT001 option is not set to TRUE */