単一キャッシュ・インスタンスの動的ロードの例
動的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 ILTimesTenデータベースで、TimesTenキャッシュ管理ユーザーとして接続します。次に、次の文を実行して、sales.customer、sales.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表にはorderidとitemidの複合主キーがあります。
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.