この付録では、式フィルタを使用するアプリケーションの例について説明します。
アクティブなデータベース・システムで特定の条件が満たされる場合、サーバーによりなんらかのアクションが実行されます。たとえば、アプリケーションはデータベース表のデータに対する変更を監視し、これらの変更に適切に対応できます。
第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
演算子の結合セマンティクスを使用すると、複数の表に格納されたデータ間で複雑なN 対M (多対多)関係を維持することもできます。
各担当の職責(職務)とワークロードに基づいて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
列に定義された式フィルタ索引を使用できます。