単一キャッシュ・インスタンスの動的ロードの例

動的AWTキャッシュ・グループにキャッシュされるOracleデータベース表を定義する例を示します。

動的AWTキャッシュ・グループにキャッシュされるOracle Database表の定義は、次のとおりです。Oracle Database表は、スキーマ・ユーザーsalesが所有しています。

CREATE TABLE customer
(cust_num NUMBER(6) NOT NULL PRIMARY KEY,
 region   VARCHAR2(10),
 name     VARCHAR2(50),
 address  VARCHAR2(100));

CREATE TABLE orders
(ord_num      NUMBER(10) NOT NULL PRIMARY KEY,
 cust_num     NUMBER(6) NOT NULL,
 when_placed  DATE NOT NULL,
 when_shipped DATE NOT NULL);

CREATE TABLE orderdetails
 (orderid  NUMBER(10) NOT NULL,
  itemid   NUMBER(8) NOT NULL,
  quantity NUMBER(4) NOT NULL,
  PRIMARY KEY (orderid, itemid));

たとえば、キャッシュされたOracle Database表sales.customerのデータを次に示します。

CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------    
       1   West      Frank Edwards     100 Pine St., Portland OR
       2   East      Angela Wilkins    356 Olive St., Boston MA
       3   Midwest   Stephen Johnson   7638 Walker Dr., Chicago IL

TimesTenデータベースで、TimesTenキャッシュ管理ユーザーとして接続します。次に、次の文を実行して、sales.customersales.ordersおよびsales.orderdetails表をキャッシュする動的AWTキャッシュ・グループnew_customersを作成します:

CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP new_customers
FROM sales.customer
 (cust_num NUMBER(6) NOT NULL,
  region   VARCHAR2(10),
  name     VARCHAR2(50),
  address  VARCHAR2(100),
  PRIMARY KEY(cust_num)),
sales.orders
 (ord_num      NUMBER(10) NOT NULL,
  cust_num     NUMBER(6) NOT NULL,
  when_placed  DATE NOT NULL,
  when_shipped DATE NOT NULL,
  PRIMARY KEY(ord_num),
  FOREIGN KEY(cust_num) REFERENCES sales.customer(cust_num)),
sales.orderdetails
 (orderid  NUMBER(10) NOT NULL,
  itemid   NUMBER(8) NOT NULL,
  quantity NUMBER(4) NOT NULL,
  PRIMARY KEY(orderid, itemid),
  FOREIGN KEY(orderid) REFERENCES sales.orders(order_num));

次の例では、DynamicLoadEnableがデフォルトで1に設定されているデフォルトの動作を示します。

TimesTenキャッシュ表sales.customerは、最初は空になっています:

Command> SELECT * FROM sales.customer;
0 rows found.

sales.customer表の主キーに対して等価条件が指定された、次のSELECT文では単一キャッシュ・インスタンスの動的ロードが発生します:

Command> SELECT * FROM sales.customer WHERE cust_num = 1;
< 1, West, Frank Edwards, 100 Pine St., Portland OR >

主キーで等価条件を使用せず、複数のキャッシュ・インスタンスの動的ロード用に構成しない場合、複数のキャッシュ・インスタンスになるため、この例で動的ロードは発生しません。このシナリオの構成方法の詳細は、「複数のキャッシュ・インスタンスの動的ロード」を参照してください。

Command> SELECT * FROM sales.customer WHERE cust_num IN (1,2);

次の例では、複合主キーのすべての主キー列に等価式が含まれています。orderdetails表にはorderiditemidの複合主キーがあります。

UPDATE sales.orderdetails SET quantity = 5 WHERE orderid=2280 AND itemid=663;

次の例はorders子表へのINSERTを示しており、これにより動的ロードが開始されます。ただし、親表であるcustomerへの挿入を試行した場合、動的ロードは発生しません。

INSERT INTO orders VALUES(1,1, DATE '2012-01-25', DATE '2012-01-30');

次のUPDATE文では、キャッシュされたOracle Database表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスを動的にロードし、キャッシュ表のインスタンスを更新して、その更新をキャッシュされたOracle Database表に自動的に伝播します。

Command> UPDATE sales.customer SET name = 'Angela Peterson' WHERE cust_num = 2;
Command> SELECT * FROM sales.customer;
< 1, West, Frank Edwards, 100 Pine St., Portland OR >
< 2, East, Angela Peterson, 356 Olive St., Boston MA >

キャッシュされたOracle Database表sales.customerの更新データは、次のとおりです:

CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------    
       1   West      Frank Edwards     100 Pine St., Portland OR
       2   East      Angela Peterson   356 Olive St., Boston MA
       3   Midwest   Stephen Johnson   7638 Walker Dr., Chicago IL

次のDELETE文では、キャッシュされたOracle Database表からTimesTenキャッシュ表に1つのキャッシュ・インスタンスを動的にロードし、キャッシュ表のインスタンスを削除し、その削除をキャッシュされたOracle Database表に自動的に伝播します。

Command> DELETE FROM sales.customer WHERE cust_num = 3;
Command> SELECT * FROM sales.customer;
< 1, West, Frank Edwards, 100 Pine St., Portland OR >
< 2, East, Angela Peterson, 356 Olive St., Boston MA >

キャッシュされたOracle Database表sales.customerの更新データは、次のとおりです。

CUST_NUM   REGION    NAME              ADDRESS
--------   -------   ---------------   ---------------------------    
       1   West      Frank Edwards     100 Pine St., Portland OR
       2   East      Angela Peterson   356 Olive St., Boston MA

次に、ルート表で一意索引のすべての列を使用して実行される動的ロードの例を示します。departments表は、動的AWTキャッシュ・グループで定義されます。manager_idおよびlocation_idで構成されるこのキャッシュ・グループで一意索引が作成されます。

次のようにして、Oracle Databaseでdepartments表を作成します。

Command> CREATE TABLE departments(
        department_id INT NOT NULL PRIMARY KEY,
        department_name VARCHAR(10) NOT NULL,
        technical_lead INT NOT NULL,
        manager_id INT,
        location_id INT NOT NULL);

次のようにして、dept_cgルート表で動的AWTキャッシュ・グループおよび一意索引を作成します。

Command> CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP dept_cg
        FROM departments
        (department_id INT NOT NULL PRIMARY KEY, 
         department_name VARCHAR(10) NOT NULL, 
         technical_lead INT NOT NULL, 
         manager_id INT, location_id INT NOT NULL);

Command> CREATE UNIQUE INDEX dept_idx 
         ON departments
         (manager_id, 
          location_id);

次のようにして、Oracle Databaseでdepartments表に3つのレコードを挿入します。

Command> INSERT INTO departments 
              VALUES (1, 'acct', 1, 1, 100);
1 row inserted.
Command> INSERT INTO departments 
          VALUES (2, 'hr', 2, 2, 200);
1 row inserted.
Command> INSERT INTO departments 
          VALUES (3, 'owner', 3, NULL, 300);
1 row inserted.
Command> commit;

TimesTenで、一意索引に基づいてキャッシュ・インスタンスを動的にロードします。

Command> SELECT * FROM departments;
0 rows found.
Command> SELECT * FROM departments 
           WHERE manager_id IS NULL AND location_id=300;
< 3, owner, 3, <NULL>, 300 >
1 row found.
Command> SELECT * FROM departments;
< 3, owner, 3, <NULL>, 300 >
1 row found.
Command> SELECT * FROM departments 
          WHERE manager_id=2 AND location_id=200;
< 2, legal, 2, 2, 200 >
1 row found.
Command> SELECT * FROM departments;
< 2, legal, 2, 2, 200 >
< 3, owner, 3, <NULL>, 300 >
2 rows found.