ルール・クラスに対して構成されたアクション・コールバック・プロシージャは、ルール・クラス内のすべてのルールに対するアクションを実行するための共通のエントリ・ポイントとして機能します。このプロシージャは、イベント(プリミティブまたはコンポジット)と一致するルールごとに1回コールされます。このプロシージャでは、実行時に、ルールに一致するイベント、および一致するルールに関連付けられたアクション・プリファレンスのリストにアクセスします。アクション・コールバック・プロシージャを実装するユーザーは、この情報を参照して各ルールに対する適切なアクションを決定できます。ルール・マネージャは、ルール・クラスで使用するアクション・プリファレンスのタイプを制限しないため、最大限の柔軟性を備えています。最も単純なケースでは、ルールに関連付けられたアクション・プリファレンスとして1つ以上のスカラー値を使用でき、各ルールに対して適切なアクションを実行する共通プロシージャ(第2.4項の例にあるOfferPromotion)への引数として使用されます。一例として、表G-1に、PromoType、OfferedByおよびDiscountの3タイプのアクション・プリファレンスを使用して作成されるルール・クラスを示します。
表G-1 TravelPromotionルール・クラス表
| rlm$ruleId | rlm$rulecond | rlm$enabled | PromoType | OfferedBy | Discount | rlm$ruledesc |
|---|---|---|---|---|---|---|
|
AB_AV_ORL |
Airline='Abcair' and ToCity='Orlando' |
'Y' |
RentalCar |
Acar |
10 |
追加情報 |
|
AC_HT_SJC |
Airline='Acbair' and ToCity='San Jose' |
'Y' |
Hotel |
Ahotel |
5 |
追加情報 |
|
... |
... |
... |
... |
... |
... |
... |
データベース内の1つのPL/SQLプロシージャを実装し、適切な引数を受け取ってすべてのタイプの値引を提供する場合、前述のルール・クラスのアクション・コールバック・プロシージャでは、次に示すように、そのプロシージャを使用して適切なアクションを実行できます。
CREATE or REPLACE PROCEDURE PromoAction (rlm$event AddFlight,
rlm$rule TravelPromotion%ROWTYPE) is
BEGIN
OfferPromotion(rlm$event.CustId,
rlm$rule.PromoType,
rlm$rule.OfferedBy,
rlm$rule.Discount);
END;
ただし、すべてのルールに対するアクションが1つのプロシージャではなく少数のプロシージャとともに実装されている場合、アクション・コールバック・プロシージャは、いずれかのアクション・プリファレンス値を使用して適切なプロシージャを選択するように実装できます。たとえば、提供する特典がホテルかレンタカーかによって使用するプロシージャが異なる場合、前述のアクション・コールバック・プロシージャは次のように実装できます。
CREATE or REPLACE PROCEDURE PromoAction (rlm$event AddFlight,
rlm$rule TravelPromotion%ROWTYPE) is
BEGIN
CASE rlm$rule.PromoType
WHEN 'RentalCar' then
OfferRentalCarPromotion(rlm$event.CustId,
rlm$rule.OfferedBy,
rlm$rule.Discount);
WHEN 'Hotel' then
OfferHotelPromotion (rlm$event.CustId,
rlm$rule.OfferedBy,
rlm$rule.Discount);
ELSE
OfferPromotion(rlm$event.CustId,
rlm$rule.PromoType,
rlm$rule.OfferedBy,
rlm$rule.Discount);
END CASE;
END;
ルールごとに異なるアクションが必要な複雑なルール・アプリケーションの場合、アクションをモデル化するPL/SQLコマンドをルール・アクション・プリファレンスとして格納できます。そのために、前述のルール・クラス表は、表G-2に示すように、匿名PL/SQLコード・ブロックをルール・アクション・プリファレンスとして格納するように構成できます。
表G-2 変更後のTravelPromotionルール・クラス表
| rlm$ruleId | rlm$rulecond | rlm$enabled | ActionCommands | rlm$ruledesc |
|---|---|---|---|---|
|
AB_AV_ORL |
Airline='Abcair' and ToCity='Orlando' |
'Y' |
begin OfferAcarPromotion(:1,10); end; |
追加情報 |
|
AC_HT_SJC |
Airline='Acbair' and ToCity='San Jose' |
'Y' |
begin OfferAhotelPromotion (:1, 5); end; |
追加情報 |
|
... |
... |
... |
... |
... |
このルール・クラス構成の場合、アクション・コールバック・プロシージャは、次に示すように、EXECUTE IMMEDIATEコマンドを使用して匿名PL/SQLコード・ブロックを実行するように実装できます。
CREATE or REPLACE PROCEDURE PromoAction (rlm$event AddFlight,
rlm$rule TravelPromotion%ROWTYPE) is
BEGIN
EXECUTE IMMEDIATE rlm$rule.ActionCommands USING rlm$event.CustId;
END;
/
データベース内のルール・アプリケーションでは、前述の3つのプロシージャを組み合せて使用することによって、複雑なアクション実行ロジックをモデル化できます。そのために、最大997のアクション・プリファレンス列を持ち、各列に有効なSQLデータ型(RAW、CLOBおよびXMLを含む)を設定したルール・クラスを作成できます。