ヘッダーをスキップ
Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド
11gリリース1(11.1)
E05697-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

G アクション・コールバック・プロシージャを使用した各種形式のルール・アクションの実装

ルール・クラスに対して構成されたアクション・コールバック・プロシージャは、ルール・クラス内のすべてのルールに対するアクションを実行するための共通のエントリ・ポイントとして機能します。このプロシージャは、イベント(プリミティブまたはコンポジット)と一致するルールごとに1回コールされます。このプロシージャでは、実行時に、ルールに一致するイベント、および一致するルールに関連付けられたアクション・プリファレンスのリストにアクセスします。アクション・コールバック・プロシージャを実装するユーザーは、この情報を参照して各ルールに対する適切なアクションを決定できます。ルール・マネージャは、ルール・クラスで使用するアクション・プリファレンスのタイプを制限しないため、最大限の柔軟性を備えています。最も単純なケースでは、ルールに関連付けられたアクション・プリファレンスとして1つ以上のスカラー値を使用でき、各ルールに対して適切なアクションを実行する共通プロシージャ(第2.4項の例にあるOfferPromotion)への引数として使用されます。一例として、表G-1に、PromoTypeOfferedByおよび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データ型(RAWCLOBおよびXMLを含む)を設定したルール・クラスを作成できます。