Oracle Databaseの1機能であるルール・マネージャは、式フィルタとオブジェクト・リレーショナルの機能を使用して特殊な目的のルール・エンジンの機能を提供しますが、その機能は以前より優れたスケーラビリティと操作特性を備えています。
ルール・マネージャでは、次の用語が使用されます。
イベント構造は、イベントの特定の機能を示す一連の属性で定義されたオブジェクト(抽象)型です。たとえば、航空会社、顧客ID、出発地などの変数を使用して顧客のフライト情報を取得するデータ構造です。AddFlightイベント構造のオブジェクト型定義は、次のようになります。
TYPE AddFlight AS OBJECT ( CustId NUMBER, Airline VARCHAR2(20), FromCity VARCHAR2(30), ToCity VARCHAR2(30), Depart DATE, Return DATE);
イベントは、イベント構造のインスタンス化であるため、イベント構造の各インスタンスがイベントです。たとえば、次に示すのは3つのイベントです。
AddFlight (123, 'Abcair', 'Boston', 'Orlando', '01-Apr-2003', '08-Apr-2003'); AddFlight (234, 'Acbair', 'Chicago', 'San Jose', '01-Aug-2003', '10-Aug-2003'); AddFlight (345, 'Acbair', 'New York', 'San Jose', '22-Jun-2003', '24-Jun-2003');
イベントは、2つのタイプに分類されます。
プリミティブ・イベント: アプリケーション内で、即時性があり基本とみなされるイベントを表します。プリミティブ・イベントは、それ以上他のイベントに分割することはできず、発生するか発生しないかのいずれかです。各プリミティブ・イベントは、通常、ある特定の時点にバインドされており、対応するイベント構造に対して定義されているルールは、このイベントで完全に評価できます。たとえば、前述のAddFlight
イベントはプリミティブ・イベントの例です。
AddFlight (CustId, Airline, FromCity, ToCity, Depart, Return)
コンポジット・イベント: 2つ以上のプリミティブ・イベントの組合せを表します。コンポジット・イベントに含まれるプリミティブ・イベントはすべて、ある時間枠にバインドされているため、様々な時点で生成される可能性があります。したがって、コンポジット・イベント構造に対して定義したルールは、対応するプリミティブ・イベントがすべて生成されるまで完全に評価されません。たとえば、AddFlightプリミティブ・イベントに2番目のプリミティブ・イベントAddRentalCarを追加すると、コンポジット・イベントが作成されます。
AddFlight (CustId, Airline, FromCity, ToCity, Depart, Return) AddRentalCar (CustId, CarType, Checkout, Checkin, Options)
コンポジット・イベント構造に対するルールの評価は、コンポジット・イベントのすべての部分が使用可能になるまで延期する必要があるため、ルール・マネージャには、コンポジット・イベントを効率的に評価する方法がいくつか用意されています。
コンポジット・イベントと複雑なルール・アプリケーションの詳細は、第2.4項を参照してください。
ルール・クラスは、共通のイベント構造を共有する一連のルールを格納およびグループ化するデータベース表です。たとえば、次に示す3つのルールのルール・クラスは、AddFlightイベント構造に対するルール・クラスです。
ON AddFlight (CustId, Airline, FromCity, ToCity, Depart, Return) IF Airline = 'Abcair', and ToCity = 'Orlando' THEN OfferPromtion (CustId, 'RentalCar', 'Acar') ON AddFlight (CustId, Airline, FromCity, ToCity, Depart, Return) IF Airline = 'Acbair', and ToCity = 'Houston' THEN OfferPromtion (CustId, 'RentalCar', 'Bcar') ON AddFlight (CustId, Airline, FromCity, ToCity, Depart, Return) IF ToCity = 'Orlando' and Return-Depart >7 THEN OfferPromtion (CustId, 'ThemePark', 'Ocean World')
ルールは、対応するイベント構造のインスタンスに対して評価されます。たとえば、次のイベントは、AddFlight
イベント構造を使用して定義したルールの評価に使用されます。
AddFlight (123, 'Abcair', 'Boston', 'Orlando', '01-Apr-2003', '08-Apr-2003');
ルールはルール・クラス表内の1つの行であり、その構成要素は次のとおりです。
ルール条件。イベント構造で定義されている属性を使用して形成された条件式です。次の例は、Airline、ToCity、ReturnおよびDepartの各属性を使用したルール条件です。
Airline = 'Abcair' and ToCity = 'Orlando' and Return-Depart >= 7
ルール・アクション・プリファレンス。各ルールの正確なアクションを決定し、そのアクションの詳細を指定します。
通常、ルール・クラス内のルールに関連付けられているアクションは同種です。たとえば、ルール・クラスを使用して、チェックアウト・プロセス時に提供する値引を決定する場合、そのクラス内の各ルールは、特定の値引率に関連付けられます。イベント・インスタンスと照合するルールの場合、これらの値は、ルールに対する適切なアクションを決定するために使用されます。
アクション・プリファレンスには、次のような様々な形式があります。
共通のプロシージャに引数としてバインドされるリテラルのリスト。次に例を示します。
'RentalCar', 'Acar', 'Bcar',...
動的なPL/SQLコマンド。次に例を示します。
BEGIN OfferRentalPromotion(:1,'Acar'); END;
アクション・コールバック・プロシージャは、ルール・クラス内のすべてのルールに対してアクションを実行するためのエントリ・ポイントとして機能するプロシージャです。このプロシージャは、ルールとイベント属性に関連付けられたアクション・プリファレンスに基づいて、ルール・クラス内の各ルールに対するアクションを実行するために実装されます。前述の例の場合は、アクション・コールバック・プロシージャを実装して、適切な引数でOfferPromotionプロシージャを起動できます。
結果ビューは、複数層にまたがるアプリケーションなど、各一致ルールのアクションをアクション・コールバック・プロシージャで実行できない場合に、外部アクション実行用のルール・クラスを構成します。
イベントと一致するルールは、この事前構成済ビューを問い合せることで使用でき、対応するアクションは、問合せを発行するコンポーネントで実行できます。これは、特定のルールのアクションが複数層のアプリケーションで実装される場合に有効です。詳細は、第2.6項を参照してください。
ルール評価の結果を結果ビューから使用できるのは、ルール・セッションの終了までです。デフォルトでは、データベース・セッション(接続から切断まで)がルール・セッションとみなされます。または、セッションの再設定プロシージャ(dbms_rlmgr.reset_session( )
)を使用すると、データベース・セッション内でルール・セッションを終了し、新規セッションを開始できます。ルール・セッションの開始時には、結果ビューは空であることに注意してください。
ルール・クラス・プロパティでは、ルール・マネージャが各ルール・アプリケーションに対して実施するイベント管理ポリシーが定義されます。この章で説明する2つのメイン・ポリシーは、使用率と競合解消です。使用率は、イベントを複数のルール実行に対して使用できるか、または単一のルール実行に対してのみ使用できるかを表します(第3.1項を参照)。競合解消(順序付け)は、様々なイベントとのルール照合の実行順序を決定します(第3.2項を参照)。ルール・マネージャがサポートするイベント管理ポリシーの完全なセットについては、第2.5項および第3章で説明します。
ルール・マネージャは、リレーショナル表を使用してルール・クラスのコンテンツを格納し、表内の各行で1つのルールを表します。ルール・クラス表には、ルール識別子(rlm$ruleid
)、ルール条件(rlm$rulecond
)、ルールの説明(rlm$ruledesc
)の最低3つの列があります。この他に、ルール・アクション・プリファレンスを格納する列が1つ以上あります。
図2-1に、AddFlightイベント・インスタンスを処理するためのTravelPromotionルール・クラスとそのルールのデータベース表現を示します。
TravelPromotionルール・クラスは次の列で構成されます。
rlm$ruleid
: ルール・クラス内の各ルールを識別する一意のルール識別子が格納されます。
rlm$rulecond
: 各ルールを記述するルール条件が格納されます。この例では、ルール条件が満たされると、指定された販促を提示できます。
rlm$enabled
: ルール・クラスに追加したルールが有効か無効かを示す値が格納されます。値'
Y
'
はルールが有効であることを示し、値'N'
はルールが無効であることを示します。デフォルトでは、rlm$enabled
列に値を指定せずに作成されたルールは有効と判断されます。
PromoType
: ルール条件が満たされたときに使用する1つのアクション・プリファレンスが格納され、それぞれで、ルール・クラス内のルールに対するアクションを実行するアクション・コールバック・プロシージャがコールされます。この例では、レンタカーや滞在ホテルの販促など、提供する販促のタイプがこの列に格納されています。PromoActionアクション・コールバック・プロシージャは、この値を使用し、適切な引数でOfferPromotionプロシージャを起動します。
OfferedBy
: 前述のアクション・プリファレンス列に関連付けられている別のアクション・プリファレンスが格納されます。この例では、販促を提供する企業の名前が格納されています。
rlm$ruledesc
: ルールの定義者によるプレーン・テキストでのルール説明が格納されます。
ECAルールは、TravelPromotionルール・クラス表の1つの行に格納されます。データベースにオブジェクト型として定義されるイベント構造は、ルール条件列に関連付けられ、これによって、ルール条件(列に格納されている)に必要なボキャブラリが提供されます。イベント構造、ルール・クラス表およびアクション・コールバック・プロシージャはすべて、ルール・クラス作成の一部として作成されます。
すべてのルールがルール・クラスに追加されると、イベントを処理し、ルールを評価できる状態になります。実行時に、ルール・クラス内の各ルールは、イベント構造の各インスタンスと照合して処理されます。特定のイベントに対してルールがTRUEに評価されると、PromoAction
アクション・コールバック・プロシージャは、ルール・アクション・プリファレンスを使用して指定のOfferPromotion
プロシージャをコールし、特定ベンダーから特定の販促タイプを提供する規定のアクションを実行します。ルール・マネージャは、イベントが複数のルールと一致した場合の競合解消や、初回の一致検出のみでそれ以降の評価が不要な場合の即時イベント使用など、様々なイベント管理ポリシーを実行します。このようなイベント管理ポリシーについては、第3章で詳しく説明します。
第2.3項、第2.6項および第2.4項では、単純イベントを使用するルール・アプリケーション、複数層にまたがるルール・アプリケーション、およびコンポジット・イベントを使用するルール・アプリケーションの作成処理についてそれぞれ説明します。基本的な5つの手順は3つの例すべてについて同じですが、詳細は異なり、複数層アプリケーションの場合はいくつかの追加手順が必要です。
単純(非コンポジット)イベントを使用するルール・アプリケーションを作成する基本手順は、次のとおりです。
データベースにオブジェクト型としてイベント構造を作成します。
AddFlight
の例を使用すると、イベント構造は次のように定義されます。
CREATE TYPE AddFlight AS OBJECT ( CustId NUMBER, Airline VARCHAR2(20), FromCity VARCHAR2(30), ToCity VARCHAR2(30), Depart DATE, Return DATE);
イベント構造に対してルール・クラスを作成します。
注意: ルール・クラスを正常に作成するには、ビュー、オブジェクト型、表、パッケージおよびプロシージャの作成権限が必要です。 |
この例の場合は、AddFlight
イベント構造に対してTravelPromotion
ルール・クラスを作成し、そのアクション・プリファレンスとしてPromoType
列とOfferedBy
列を定義します。このプロシージャは、引数として、ルール・クラスの名前、手順1で作成した既存のイベント構造の名前、アクション・コールバック・プロシージャの名前およびアクション・プリファレンス仕様を使用します。アクション・プリファレンス仕様では、ルール・クラス内の各ルールに関連付けられているアクション・プリファレンスのデータ型が定義されます。
BEGIN dbms_rlmgr.create_rule_class ( rule_class => 'TravelPromotion', event_struct => 'AddFlight', action_cbk => 'PromoAction', actprf_spec => 'PromoType VARCHAR2(20), OfferedBy VARCHAR2(20)'); END;
ルール・クラスの作成では、対応するルール定義とアクション・プリファレンスを格納する表が作成されます。このルール・クラス表は、ルール・クラスと同じ名前を使用して、ユーザーのスキーマに作成されます。ルール・クラス表には、ルール識別子、ルール説明およびルール条件を格納する3つの列が定義されます。この例では、アクション・プリファレンスを格納するために前述のコマンドで指定された、ルール・アクション・プリファレンス列も作成されます。
TABLE TravelPromotion ( rlm$ruleid VARCHAR2(100), rlm$rulecond VARCHAR2(4000), rlm$enabled CHAR(1) DEFAULT 'Y', rlm$ruledesc VARCHAR2(1000), PromoType VARCHAR2(20), OfferedBy VARCHAR2(20));
ユーザーは、この表を問い合せてルール・クラスに定義されているルールを参照でき、さらに、SQLのINSERT
、UPDATE
およびDELETE
操作を実行して、ルールを追加、更新および削除できます。
ルール・クラスの作成では、アクションを実行するコールバック・プロシージャ用のスケルトンが暗黙的に作成されます。アクション・コールバック・プロシージャは、ルール・クラス内のすべてのルールに対してアクションを実行するためのエントリ・ポイントとして機能します。アクション・コールバックは、各ルールがイベントと一致するたびに1回コールされます。アクション・コールバック・プロシージャの実装は、一致ルールに関連付けられているイベント・インスタンスとアクション・プリファレンスの値に依存する場合があります。
PROCEDURE PromoAction (rlm$event AddFlight, rlm$rule TravelPromotion%ROWTYPE) is BEGIN null; --- The action for the matching rules can be performed here. --- The appropriate action can be determined from the event --- instance and the action preferences associated with each rule. END;
この例では、アクション・コールバック・プロシージャは、ユーザーが指定した名前で作成され、引数は2つあります。
対応するオブジェクト型のインスタンスとしてのイベント。
対応するルール・クラス表のROWTYPEとしてのアクション・プリファレンス。%ROWTYPE属性によって、表内の行を表すレコード型が提供されます。
各一致ルールに対して適切なアクションを実行するために、システム生成コールバック・プロシージャをユーザー実装で置き換えます。次のアクション・コールバック・プロシージャを実装すると、イベント・インスタンスおよびルール定義から取得した引数でOfferPromotion
プロシージャを起動できます。
例:
PROCEDURE PromoAction ( rlm$event AddFlight, rlm$rule TravelPromotion%ROWTYPE) is BEGIN OfferPromotion (rlm$event.CustId, rlm$rule.PromoType, rlm$rule.OfferedBy); END;
この例では、プロシージャOfferPromotion
によってアクションが実行され、一致ルールによって適切なアクション・プリファレンスが提供されます。付録Gには、様々なアクション・プリファレンスの選択に対してアクション・コールバック・プロシージャを実装する別の方法が示されています。
ルール・クラスにルールを追加します。
ルールの追加では、SQL INSERT
文を使用して各ルールに対する行を追加します。挿入される各行には通常、アクション・プリファレンスのルール識別子、条件および値が格納されます。TravelPromotion
表に、次のルールが挿入されます。
INSERT INTO TravelPromotion (rlm$ruleid, PromoType, OfferedBy, rlm$rulecond) VALUES
('UN_AV_FL', 'Rental Car', 'Acar',
'Airline= ''Abcair'' and ToCity = ''Orlando'' and Return-Depart >= 7
');
イベントに対するルールを処理します。
dbms_rlmgr.process_rules( )
プロシージャを使用して、イベント・インスタンスに対するルール・クラス内のルールを処理します。ルールの処理では、イベント・インスタンスが、名前/値ペア(getVarchar( )
プロシージャを使用して生成される)の文字列として渡されるか、第11.3項の説明のようなバイナリ・データ型で構成されるイベントの場合は、AnyDataインスタンスとして渡されます。可能な場合は、データ項目を文字列形式の名前/値ペアとして表すためにオラクル社が提供するgetVarchar( )
メソッドが使用されること、およびオラクル社が提供するオブジェクト型AnyData
によって、オラクル社が提供するデータ型とユーザー定義のデータ型の両方のOracleデータ型のインスタンスを格納できることに注意してください。
次の例では、getVarchar( )
関数を使用して、AddFlight
イベント・インスタンスに対するTravelPromotion
ルール・クラス内のルールが処理されます。
BEGIN
dbms_rlmgr.process_rules (
rule_class => 'TravelPromotion',
event_inst => AddFlight.getVarchar(987, 'Abcair', 'Boston', 'Orlando', '01-APR-2003', '08-APR-2003')
);
END;
次の例では、AnyData.ConvertObject( )
プロシージャを使用して、AddFlight
イベント・インスタンスに対するTravelPromotion
ルール・クラス内のルールが処理されます。
BEGIN
dbms_rlmgr.process_rules (
rule_class => 'TravelPromotion',
event_inst => AnyData.convertObject(AddFlight(987, 'Abcair', 'Boston', 'Orlando', '01-APR-2003', '08-APR-2003')));
END;
前述のコマンドでは、AddFlight
イベント・インスタンスに対するTravelPromotion
ルール・クラス内のルールが処理され、アクション・コールバック・プロシージャを使用して、各一致ルールに関連付けられているアクションが実行されます。
多くの場合、一般的なタイプのルール・アプリケーションでは、2つ以上のプリミティブ・イベントを結合したコンポジット・イベント構造が使用されます。コンポジット・イベントに対するルール・クラスの評価には、追加要件があります。ルール・マネージャでは、これらの要件が次のように処理されます。
ルール実行に対するイベントの集計
2つ以上のプリミティブ・イベントが結合されている場合、各プリミティブ・イベントは、アプリケーションにより、異なる時点で生成される可能性があります。これは、多くの場合、すべてのプリミティブ・イベントが使用可能になるまでは、最終的にルールを評価できないことを意味します。ルール・マネージャはプリミティブ・イベントを管理し、ルールを評価する前にこれらのイベントを結合します。また、プリミティブ・イベントとコンポジット・イベントの間の関連を保持することによって、コンポジット・イベント管理の複雑さがなくなります。詳細は、第5章を参照してください。
イベント処理の中間状態の保持
コンポジット・イベントがユーザー・アプリケーション内で完全に形成されている場合、ルール条件の一部は、コンポジット・イベントの一部で繰返して評価が必要な場合があります。この結果、一致ルールを検出するために、1つのプリミティブ・イベントを、2番目のプリミティブ・イベントの各インスタンスなどに対して複数回評価する可能性があります。この評価は、プリミティブ・イベントの数が2つを超えると急に複雑になります。XMLタグによるコンポジット・イベントに対するルールの増分評価のサポートによって、ルール・マネージャのシステム・パフォーマンスが改善されます。ルール・マネージャでは、効率的な処理のために、ルール評価の中間の状態が永続的に保持されます。詳細は、第5.1項を参照してください。
注意: ルールに対して保持された中間状態は、対応するルール条件と緊密に関連しています(コンポジット・イベントの場合)。このため、ルール条件への変更(UPDATE コマンドを使用)によって、ルールに関連付けられた中間状態が破棄され、その中間状態は次に処理されるイベントのみのために保持されます。事実上、ルール条件の更新とは対応するルールの削除および新しいルールの挿入と同義です。ルール・アクション・プリファレンスやルール識別子の変更は、ルール評価状態に影響しません。 |
複雑なルール構成メンバーのサポート
ルール・マネージャを使用すると、条件式に、否定、Any n およびセット・セマンティクスを使用した複雑なルールを作成できます。ルール条件内でXMLタグを使用すると、アプリケーションで一般的に使用されるこれらの複雑なルール構成メンバーをルール・マネージャでサポートできます。詳細は、第5章を参照してください。
イベント管理ポリシーの設定
ルール・マネージャでは、アプリケーションの専門知識のある個人はルール・アプリケーションのイベント管理ポリシーを宣言的に設定できます。ルール・クラスが単純イベントおよびコンポジット・イベントの動作、およびコンポジット・イベントのパフォーマンスを制御してシステムに作成される場合、イベント・ポリシーはルール・クラスのプロパティとして指定されます。
ルール実行の順序、および複数のルール実行に対するイベントの再利用を制御するポリシーは、コンポジット・イベントのみでなく単純イベントを使用するアプリケーションにも適用できます。その他のコンポジット・イベント指定ポリシーは、イベントの未使用期間、イベントの順序およびコンポジット・イベント内のプリミティブ・イベントの相関関係を管理します。イベント管理ポリシーについては、第2.5項で要約し、第3.1項〜第3.8項で説明します。
注意: EQUALプロパティは、コンポジット・イベントに対して構成される場合、ルール・クラスを指定する必要があります。ルール・クラスのすべてのルールに対してプリミティブ・イベントを関連付ける共通の等価結合述語を識別するには、専門知識が必要です。 |
コンポジット・イベントを使用したルール・アプリケーションの設計
コンポジット・イベントに対するルール・アプリケーションの開発では、データベース(SQL)アプリケーションの開発と類似する部分があります。ルール・アプリケーションでのイベント構造の定義は、データベース・アプリケーションの表定義と同じです。これらの表で稼働しているSQL問合せは、ルール・クラスで定義されたルール条件と同じです。データベース・アプリケーションでは、各アプリケーションに固有の制約および索引は、データの整合性およびパフォーマンスに対して作成されます。同様に、ルール・アプリケーションの場合、ルール・クラスにプロパティが指定されると、イベント管理ポリシーが実行され、パフォーマンスが改善します。これらのルール・クラス・プロパティについては、第2.5項で要約し、第3章で説明します。
コンポジット・イベントを使用するルール・アプリケーションを作成する基本手順は、第2.3項で説明した単純イベントに対する手順と同じですが、複数プリミティブ・イベントに対する調整が必要です。
コンポジット・イベントを使用するルール・アプリケーションを作成する手順は、次のとおりです。
データベースにオブジェクト型としてコンポジット・イベント構造を作成します。
最初に、各プリミティブ・イベント構造がオブジェクト型として作成されます。次に例を示します。
CREATE or REPLACE TYPE AddFlight AS OBJECT ( CustId NUMBER, Airline VARCHAR2(20), FromCity VARCHAR2(30), ToCity VARCHAR2(30), Depart DATE, Return DATE); CREATE or REPLACE TYPE AddRentalCar AS OBJECT ( CustId NUMBER, CarType VARCHAR2(20), CheckOut DATE, CheckIn DATE, Options VARCHAR2(30));
次に、コンポジット・イベントを構成するすべてのプリミティブ・イベント構造が、次のオブジェクト型の(第1レベルの)埋込み型として作成されます。次に例を示します。
CREATE or REPLACE TYPE TSCompEvent AS OBJECT (Flt AddFlight, Car AddRentalCar);
属性名Flt
およびCar
は、個々のプリミティブ・イベントで述語を識別し、プリミティブ・イベント間の結合条件を指定するためのルール条件で使用されます。Flt
およびCar
は、コンポジット・イベントに使用されるプリミティブ・イベント変数です。
コンポジット・イベント構造に対してルール・クラスを作成します。ルール・クラスは、dbms_rlmgr.create_rule_class
プロシージャのプロパティ引数に割り当てられているXMLプロパティ文書を使用して、コンポジット・イベントに対して構成されます。
BEGIN
dbms_rlmgr.create_rule_class (
rule_class => 'CompTravelPromo',
event_struct => 'TSCompEvent',
action_cbk => 'CompPromoAction',
rslt_viewnm => 'CompMatchingPromos',
actprf_spec => 'PromoType VARCHAR2(20),
OfferedBy VARCHAR2(20)',
rlcls_prop => '<composite equal="Flt.CustId, Car.CustId"/>'
);
END;
このコード例では、コンポジット・イベント構造に対してルール・クラスが作成されます。rlcls_prop
引数は、XML要素<composite>
を指定して、コンポジット・イベントに対するルール・クラスを構成します。プロパティにはequal指定も含まれ、ルール・クラスにあるすべてのルールに共通する等価性結合述語が識別されます。使用率、継続時間およびイベントの順序など、その他の重要なルール・クラス・プロパティは、第3.1項〜第3.7項で説明する構文を使用して指定できます。
この手順では、プリミティブ・イベント構造を表す各オブジェクト型が再作成され、対応するイベント作成時間を取得するタイムスタンプ属性rlm$CrtTime
が組み込まれます。この属性はTIMESTAMP
データ型で作成され、その値は、イベントのインスタンス化のときにデータベース・タイムスタンプ(SYSTIMESTAMP
)にデフォルト設定されます。または、この属性に有効なタイムスタンプ値を割り当てることによって、アプリケーションでイベント作成時間を明示的に設定することもできます。
すでに説明したように、このルール・クラスの作成では、指定した名前で次のようなアクション・コールバック・プロシージャも作成されます。
PROCEDURE CompPromotion (Flt AddFlight, Car AddRentalCar, rlm$rule CompTravelPromo%ROWTYPE) is BEGIN null; --- The action for the matching rules can be performed here. --- The appropriate action can be determined from the event --- instance and the action preferences associated with each rule. END;
注意: コンポジット・イベント内のプリミティブ・イベントは、別々の引数としてコールバック・プロシージャに渡されます。ルール・クラスがRULE使用率ポリシーに対して構成されている場合、または1つ以上のコレクション・イベントに対して使用可能な場合、アクション・コールバック・プロシージャには引数が追加されます。 |
各一致ルールに対して適切なアクションを実行するために、システム生成アクション・コールバック・プロシージャをユーザー実装で置き換えます。次に例を示します。
PROCEDURE CompPromoAction (Flt AddFlight, Car AddRentalCar, rlm$rule CompTravelPromo%ROWTYPE) is BEGIN OfferPromotion (Flt.CustId, rlm$rule.PromoType, rlm$rule.OfferedBy); END;
ルール・クラスにルールを追加します。この例では、XMLタグを使用する条件式を備えたルールを追加します。ルール条件でXMLタグ拡張を使用して複雑なルール構成メンバーをサポートする方法の詳細は、第5.1項を参照してください。
INSERT INTO CompTravelPromo (rlm$ruleid, PromoType, OfferedBy, rlm$rulecond) VALUES ('UN-HT-FL', 'RentalCar', 'Acar', '<condition> <and join="Flt.CustId = Car.CustId"> <object name="Flt"> Airline=''Abcair'' and ToCity=''Orlando'' </object> <object name="Car"> CarType = ''Luxury'' </object> </and> </condition>');
プリミティブ・イベントを一度に1つずつ使用してルールを処理します。次に例を示します。
BEGIN dbms_rlmgr.process_rules ( rule_class => 'CompTravelPromo', event_inst => AnyData.ConvertObject( AddFlight(987, 'Abcair', 'Boston', 'Orlando', '01-APR-2003', '08-APR-2003'))); dbms_rlmgr.process_rules ( rule_class => 'CompTravelPromo', event_inst => AnyData.ConvertObject( AddFlight(567, 'Abdair', 'Boston', 'Miami', '03-APR-2003', '09-APR-2003'))); dbms_rlmgr.process_rules ( rule_class => 'CompTravelPromo', event_inst => AnyData.ConvertObject( AddRentalCar(987, 'Luxury', '03-APR-2003', '08-APR-2003', NULL))); END;
このコマンドによって、ルール・マネージャに3つのプリミティブ・イベントが追加されます。手順4で定義したルールの場合は、最初のイベントがAddFlight
イベントのプリミティブ・ルール条件と一致し、3番目のイベントがAddRentalCar
イベントの条件と一致します。さらに、これらの2つのイベントは、ルール条件の結合述語を満たしています。このため、前述の例では、最初と最後のプリミティブ・イベントによって、手順4で指定したルール条件と一致するコンポジット・イベントが形成されます。これらのプリミティブ・イベント・インスタンスは、アクション実行のためにアクション・コールバック・プロシージャに渡されます。渡されるプリミティブ・イベントの型情報は、対応するAnyData
インスタンスに埋め込まれます。ただし、文字列形式のイベントが使用される場合、プリミティブ・イベントの型情報は、次のように明示的に渡す必要があります。
BEGIN
dbms_rlmgr.process_rules (
rule_class => 'TravelPromotion',
event_type => 'AddFlight',
event_inst =>
AddFlight.getVarchar(987, 'Abcair', 'Boston', 'Orlando',
'01-APR-2003', '08-APR-2003'));
END;
複雑なルール条件を使用するコンポジット・イベント評価は、ルール・マネージャで次の機能を使用してサポートされます。
ルールの増分評価。プリミティブ・イベント間で結合述語を使用できます。
ルール条件での否定の使用。プロセス内の例外(つまり、ある事項が発生しなかった場合の処理)を提示します。
ルール条件での順序付けの使用。プリミティブ・イベントの作成時間をトラッキングし、イベント間の順序付けを実行または検出します。
ルール条件でのセット・セマンティクスの使用。同じタイプのプリミティブ・イベントのインスタンスをグループとして監視できます。
ルール条件でのAny n の使用。プリミティブ・イベントのサブセットの照合を可能にします。
さらに、コンポジット・イベントに関連するルールの増分評価をサポートします。複雑なルール条件をサポートするために、SQL WHERE
句の条件式は、いくつかのXMLタグで拡張されています。これらのタグは、条件式の様々な部分を識別し、これらの式に特別なセマンティクスを追加します。複雑なルール条件の各タイプについては、第5章で詳しく説明します。ルールの増分評価の実装方法については、第5.1項で説明します。
ルール・クラス・プロパティでは、ルール・マネージャが各ルール・アプリケーションに対して実施するイベント管理ポリシーが定義されます。ルール・クラス・プロパティの内容は、次のとおりです。
使用率: イベントを複数のルール実行に対して使用できるか、または単一のルール実行に対してのみ使用できるかを決定します。
競合解消(順序付け): 様々なイベントとのルール照合の実行順序を決定します。
継続時間: 使用されていないプリミティブ・イベントの存続期間を決定します。
自動コミット: ルール・クラスを使用する各相互作用を自動的にコミットするかどうかを決定します。
記憶域: データベース内のルール・クラスの記憶域特性を決定します。
等価: ルール・クラス内のすべてのルールに対して共通の等価性結合述語を指定します。つまり、ルール・クラスに対して構成されたコンポジット・イベント内で等価であるプリミティブ・イベント属性のリストを指定します。
DMLイベント: イベント構造が1つ以上の表別名属性を使用して作成されるときに指定します。この場合、対応するルール・クラスでは、対応する表に対するデータ操作言語(DML)操作(INSERT
、UPDATE
、DELETE
)を、ルールの評価対象のイベントとみなす必要があります。
CNFイベント: DML操作を実行するトランザクションがコミットされた後にルールが処理される場合を除き、DMLイベントと同じです。
ルール・クラス・プロパティは、dbms_rlmgr.create_rule_set( )
プロシージャのrlcls_prop
引数に割り当てられているXMLプロパティ文書を使用して、ルール・クラスの作成時に指定されます。コンポジット・イベントに対して構成されるルール・クラスの場合、これらのプロパティは、コンポジット・イベント・レベルで指定されます(すべてのプリミティブ・イベントに対して)。また、プロパティ文書では、1つ以上のプリミティブ・イベントに対して優先イベントを指定できます。これらの各ルール・プロパティの詳細、およびそれぞれの実装方法については、第3.1項〜第3.8項で説明します。
複数層にまたがるルール・アプリケーションで、ルール管理はデータベースで処理されるが、ルールのアクション実行はアプリケーション・サーバーで処理される場合、イベントと一致するルールのアクションは、アクション・コールバック・プロシージャから起動できません。かわりに、結果ビューは、外部アクションの実行に使用できるイベントと一致ルールを使用して移入されます。結果ビューを問い合せると、イベントと一致するルールを判別でき、それに対応するアクションを実行できます。
アプリケーション・サーバーでアクション実行が発生する特定のルールを備えたルール・アプリケーションを処理するには、アクション・コールバック・プロシージャを構成する以外に、外部実行用のルール・クラスも構成する必要があります。この手順は第2.3項で説明した手順と類似していますが、変更点について次に簡単に説明します(各手順の詳細は、第6章を参照)。
データベースにオブジェクト型としてイベント構造を作成します(第2.3項の手順1と同様)。
ルール・クラスを作成し、結果ビューも定義します。詳細は、第6.1項の手順2を参照してください。
アクション・コールバック・プロシージャを実装します(第2.3項の手順3と同様)。
ルール・クラスにルールを追加します(第2.3項の手順4と同様)。
イベントに対する一致ルールを識別します。各イベントをルール・クラスに一度に1つずつ追加するイベントの追加プロシージャ(dbms_rlmgr.add_event( )
)を使用し、結果ビューを使用して後でアクセスされる特定のイベントに対する一致ルールを識別します。詳細は、第6.1項の手順5を参照してください。
結果ビューを問い合せて一致ルールを検索します。詳細は、第6.1項の手順6を参照してください。
ルール実行で使用されるイベントを使用します。詳細は、第6.1項の手順7を参照してください。
複数層にまたがるルール・アプリケーションの作成方法の詳細は、第6.1項を参照してください。また、複数層モードでルール・アプリケーションを実行する方法の詳細は、第6.2項を参照してください。
第2.7.1項では、SQL*Loaderを使用してルール・クラス表にデータをロードする方法について説明します。第2.7.2項では、ルール・アプリケーションのエクスポートおよびインポート方法について説明します。
SQL*Loaderを使用すると、データをASCIIファイルからルール・クラス表にバルク・ロードできます。ローダー操作では、ルール・クラス表のrlm$rulecond
列に格納されているルール条件は、VARCHAR2
列にロードされる文字列として扱われます。データファイルには、XMLおよびSQLベースのルール条件をVARCHAR2データに許可される任意の書式で格納でき、ルール・クラス表内のアクション・プリファレンス列の値は、通常のSQL*Loaderセマンティクスを使用してロードされます。
ルール条件列にロードされたデータは、ルール・クラスに関連付けられたイベント構造を使用して自動的に検証されます。この検証は、ルール条件列に定義されているトリガーによって実行されます。したがって、ルール・クラス表へのルール定義のロード時にはダイレクト・ロードを使用できません。
イベント構造とルール・クラスのセットを使用して定義されたルール・アプリケーションは、同じデータベースまたは異なるOracleデータベースに対してエクスポートしたり、インポートして戻すことができます。スキーマ内のルール・クラスは、対応するルール・クラス表がエクスポート・コマンド(expdp
)のtables
パラメータを使用してエクスポートされるとき、またはスキーマ全体がエクスポートされるときに、自動的にエクスポートされます。ルール・クラスがエクスポートされると、関連付けられているプリミティブおよびコンポジット・イベント構造の定義、およびルール・クラス内に定義されているルールはすべて、エクスポート・ダンプ・ファイルに格納されます。ただし、部分一致済ルールに対するイベント・インスタンスと増分状態の情報を保持する内部データベース・オブジェクトは、ルール・クラスとともにエクスポートされません。特定のルール・クラスのエクスポートにtables
パラメータを使用すると、アクション・コールバック・プロシージャの実装は、エクスポート・ダンプ・ファイルに書き込まれません。アクション・コールバック・プロシージャは、スキーマ・エクスポートの場合にのみエクスポートされます。
注意: ルール・クラスが共有可能なプリミティブ・ルール条件を参照している場合、条件を格納する条件表は、スキーマがエクスポートされるか、または条件表がエクスポート・コマンドのtables パラメータに明示的にリストされないかぎり、エクスポートされません。詳細は、第4.6項の最後にある注意を参照してください。 |
ルール・クラスのエクスポートで作成されたダンプ・ファイルを使用すると、ルール・クラスとそのイベント構造を同じデータベースまたは異なるOracleデータベースにインポートできます。インポート時に、ルール・クラスの状態保持に使用する内部データベース・オブジェクトが再作成されます。特定のオブジェクトがインポート・セッションで作成およびスキップされる順序によって、ルール・クラスの作成でエラーや警告が発生しますが、これらは無視してかまいません。ルール・クラスのスキーマ・レベル・インポートの場合は、アクション・コールバック・プロシージャの実装もインポート・サイトで再作成されます。ただし、表レベル・インポートの場合は、アクション・コールバック・プロシージャのスケルトンのみが作成されます。
注意: ルール・クラスが共有可能なプリミティブ・ルール条件を参照している場合、ルールはインポート時に検証され、条件表の欠落または条件表にある特定のプリミティブ条件の欠落が原因で破損した参照には、ORA-41704エラー・メッセージが戻されます。ただし、破損した参照はインポート後の操作として固定できます。そのために、参照が破損しているすべてのルール条件には、「F」を格納するrlm$enabled 列にFAILEDマークがつきます。 |