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

戻る
戻る
次へ
次へ
 

B アプリケーションの例

この付録では、式フィルタを使用するアプリケーションの例について説明します。

アクティブ・アプリケーション

アクティブなデータベース・システムで特定の条件が満たされる場合、サーバーによりなんらかのアクションが実行されます。たとえば、アプリケーションはデータベース表のデータに対する変更を監視し、これらの変更に適切に対応できます。

第1章で説明したCar4Saleアプリケーションを考えてみます。このアプリケーションでは、中古車の購入に関心を持っている顧客の情報がConsumer表に格納されます。第1章で説明したConsumer表の他にInventory表があり、次の例に示すように販売可能な中古車の情報がすべて格納されているとします。

CREATE TABLE Inventory (Model   VARCHAR2(20),
                        Year    NUMBER,
                        Price   NUMBER,
                        Mileage NUMBER);

これにより、Inventory表の行トリガーを定義して、この表のデータ変更にシステムが対応するようにアプリケーションを設計できます。

CREATE TRIGGER activechk AFTER insert OR update ON Inventory
  FOR EACH ROW
  DECLARE
    cursor c1 (ditem VARCHAR2) is
      SELECT CId, Phone FROM Consumer WHERE EVALUATE (Interest, ditem) = 1;
    ditem VARCHAR2(200);
 BEGIN
  ditem := Car4Sale.getVarchar(:new.Model, :new.Year, :new.Price, :new.Mileage);

  for cur in c1(ditem) loop
    DBMS_OUTPUT.PUT_LINE('  For Model '||:new.Model||' Call '||cur.CId||
                         ' @ '||cur.Phone);
  end loop;
END;
/

このトリガーにより、Inventory表に挿入(または更新)された各行について式が評価され、顧客がその中古車に関心を持っている場合はメッセージが印刷されます。Interest列の式フィルタ索引により、Consumer表の問合せを高速化できます。

式のバッチ評価

データ項目のバッチについて式セットを評価するために、データ項目の格納表と式の格納表の単純結合を実行できます。次の例に示すように、Consumer表をInventory表と結合して関心対象の中古車を個別に判別できます。

SELECT DISTINCT Inventory.Model, count(*) as Demand
   FROM  Consumer, Inventory
   WHERE EVALUATE (Consumer.Interest,
                Car4Sale.getVarchar(Inventory.Model,
                                    Inventory.Year,
                                    Inventory.Price,
                                    Inventory.Mileage)) = 1
   GROUP BY Inventory.Model
   ORDER BY Demand DESC;

EVALUATE演算子の結合セマンティクスを使用すると、複数の表に格納されたデータ間で複雑なNM (多対多)関係を維持することもできます。

リソース管理

各担当の職責(職務)とワークロードに基づいてITサポート・リソースを管理するアプリケーションを考えてみます。このアプリケーションでは、担当の職責は、問題の優先度、組織および環境などの変数を使用して定義された式として取得されます。

次の例に示すように、ITResourceという表を作成して、使用可能な全担当に関する情報を格納します。

-- Create the object type and the attribute set for ticket description --
CREATE OR REPLACE TYPE ITTicket AS OBJECT (
                       Priority       NUMBER,
                       Environment    VARCHAR2(10),
                       Organization   VARCHAR2(10));
/
BEGIN
  DBMS_EXPFIL.CREATE_ATTRIBUTE_SET(attr_set => 'ITTicket',
                                   from_type => 'Yes');
END;
/

-- Table storing expressions --
CREATE TABLE ITResource (RId        NUMBER,
                         Duties     VARCHAR2(100));

BEGIN
  DBMS_EXPFIL.ASSIGN_ATTRIBUTE_SET(attr_set => 'ITTicket',
                                   expr_tab => 'ITResource',
                                   expr_col => 'Duties');
END;
/

INSERT INTO ITResource (RId, Duties) VALUES
   (1, 'Priority <= 2 and Environment = ''NT'' and Organization =
                                                   ''Research''');

INSERT INTO ITResource (RId, Duties) VALUES
   (2, 'Priority = 1 and (Environment = ''UNIX'' or Environment = ''LINUX'')
        and Organization = ''APPS''');

次の例に示すように、ITProblemという表を作成して問題領域を格納します。

CREATE TABLE ITProblem (PId             NUMBER,
                        Description     ITTicket,
                        AssignedTo      NUMBER);

ITProblem表のAssignedTo列には、問題を処理する担当の識別子が格納されます。

ここで、次のUPDATE文を使用して、未割当ての問題すべてを、必要なスキルを持つIT担当に割り当てます。

UPDATE ITProblem p SET AssignedTo =
             (SELECT RId FROM ITResource r
              WHERE EVALUATE(r.Duties, p.Description.getVarchar()) = 1
                    and rownum < 2)
    WHERE AssignedTo IS NULL;

このUPDATE操作では、Resource表のDuties列に定義された式フィルタ索引を使用できます。