ルール・クラスに対して構成されたアクション・コールバック・プロシージャは、ルール・クラス内のすべてのルールに対するアクションを実行するための共通のエントリ・ポイントとして機能します。このプロシージャは、イベント(プリミティブまたはコンポジット)と一致するルールごとに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
を含む)を設定したルール・クラスを作成できます。