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

戻る
戻る
次へ
次へ
 

A 1つ以上のデータベース表で定義済の式の管理

Expression列には、1つ以上のデータベース表で定義済の式を格納できます。これらの式には、表の別名とよばれる特殊な要素属性が使用されます。要素属性はEXF$TABLE_ALIAS型を使用して作成され、属性名はEXF$TABLE_ALIAS型を介して指定された表の別名として扱われます。

たとえば、一時変数HRMGRと2つのデータベース表SCOTT.EMPおよびSCOTT.DEPTに式セットが定義されているとします。

hrmgr='Greg' and emp.job='SALESMAN' and emp.deptno = dept.deptno and
    dept.loc = 'CHICAGO'

この種の式の属性セットは、次の例に示すように作成されます。

BEGIN
  -- Create the empty Attribute Set --
  DBMS_EXPFIL.CREATE_ATTRIBUTE_SET('hrdb');

  -- Add elementary attributes to the Attribute Set --
  DBMS_EXPFIL.ADD_ELEMENTARY_ATTRIBUTE('hrdb','hrmgr','VARCHAR2(20)');

  -- Define elementary attributes of EXF$TABLE_ALIAS type --
  DBMS_EXPFIL.ADD_ELEMENTARY_ATTRIBUTE('hrdb','emp',
                                        EXF$TABLE_ALIAS('scott.emp'));
  DBMS_EXPFIL.ADD_ELEMENTARY_ATTRIBUTE('hrdb','dept',
                                        EXF$TABLE_ALIAS('scott.dept'));
END;
/

HRInterestには、このアプリケーション用に定義された式が格納されます。この表のExpression列は、次の例に示すように構成されます。

CREATE TABLE HRInterest (SubId number, Interest VARCHAR2(100));

BEGIN
  DBMS_EXPFIL.ASSIGN_ATTRIBUTE_SET('hrdb','HRInterest','Interest');
END;
/
-- insert the rows with expressions into the HRInterest table --

1つ以上の表の別名属性を使用する式では、表の別名属性を使用しない場合と同様に索引付けが可能です。たとえば、次のCREATE INDEX文では、Expression列に定義されている索引のストアド属性と索引付き属性が構成されます。

CREATE INDEX HRIndex ON HRInterest (Interest) INDEXTYPE IS EXFSYS.EXPFILTER
  PARAMETERS ('STOREATTRS (emp.job, dept.loc, hrmgr)
               INDEXATTRS (emp.job, hrmgr)');

この式が評価されるときには、対応する表からのROWIDが割り当てられ、表の別名として定義されている属性の値が渡されます。HRInterest表に格納されている式は、次の問合せを使用して、EMP表とDEPT表に格納されているデータ(行)(およびHRMGRの値)について評価できます。

SELECT empno, job, sal, loc, SubId, Interest
   FROM emp, dept, HRInterest
   WHERE emp.deptno = dept.deptno AND
    EVALUATE(Interest, hrdb.getVarchar('Greg',emp.rowid,dept.rowid)) = 1;

式がEMP表とDEPT表の行のサブセットについてのみ評価される場合は、前述の問合せにさらに述語を追加できます。

SELECT empno, job, sal, loc, SubId, Interest
   FROM emp, dept, HRInterest
   WHERE emp.deptno = dept.deptno AND
         emp.sal > 1400 AND
       EVALUATE(Interest, hrdb.getVarchar('Greg',emp.rowid,dept.rowid)) = 1;