単一キャッシュ・インスタンスの動的ロードの例
動的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.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.