3.1 有効期間のサポート: 概要と例

一部のアプリケーションでは、データにその妥当性を示す時間範囲を関連付けて格納する必要があります。つまり、各レコードは、そのレコードに関連付けられている時間範囲内でのみ有効です。

表をバージョン対応表にする場合は、有効期間のサポートを有効にできます。(「既存の表に対する有効期間サポートの追加」の説明に従って、既存のバージョン対応表に有効期間のサポートを追加することもできます。) 有効期間のサポートを有効にすると、各行にはその行に関連付けられている有効期間を保持する列が追加されます。セッションに対して有効期間の範囲を指定することができます。Workspace Managerでは、有効期間の範囲が問合せや挿入、更新および削除操作で適切に反映され適応されます。有効期間の範囲には、過去または将来を指定できます。過去、現在、将来を含めることもできます。

例3-1に、有効期間のサポートの簡単な例を示します。この例では、次の操作を実行しています。

  1. 従業員とその給与の表を作成します。

  2. 有効期間のサポートを指定して表をバージョン対応にします。これにより、表にWM_VALID列が自動的に追加されます。

  3. この表に行を挿入します。行ごとに、従業員名、給与および有効期間のサポートを指定します。

  4. セッションの有効期間の範囲を設定します。

  5. 従業員1人の新規の給与と有効期間を指定して1行を更新します。

  6. 表のバージョニングを無効化します。

例3-1:

例3-1 有効期間のサポート

-- Create a very simple employees table (deliberately oversimplified
-- for purposes of illustration).
CREATE TABLE employees (
  name VARCHAR2(16) PRIMARY KEY,
  salary NUMBER 
);

-- Version-enable the table. Specify TRUE for valid time support.
EXECUTE DBMS_WM.EnableVersioning ('employees', 'VIEW_WO_OVERWRITE', FALSE, TRUE);

INSERT INTO employees VALUES(
  'Adams',
  30000,
  WMSYS.WM_PERIOD(TO_DATE('01-01-1990', 'MM-DD-YYYY'), 
                  TO_DATE('01-01-2005', 'MM-DD-YYYY'))
);
INSERT INTO employees VALUES(
  'Baxter',
  40000,
  WMSYS.WM_PERIOD(TO_DATE('01-01-2000', 'MM-DD-YYYY'), DBMS_WM.UNTIL_CHANGED)
);

INSERT INTO employees VALUES(
  'Coleman',
  50000,
  WMSYS.WM_PERIOD(TO_DATE('01-01-2003', 'MM-DD-YYYY'), 
                  TO_DATE('12-31-9999', 'MM-DD-YYYY'))
);

COMMIT;

-- Set valid time period to virtually all time.
EXECUTE DBMS_WM.SetValidTime(TO_DATE('01-01-1900', 'MM-DD-YYYY'),
  TO_DATE('01-01-9999', 'MM-DD-YYYY'));

-- Update the salary for an existing employee. Perform "sequenced" update, so
-- that existing time-related information is preserved. This results in two rows
-- for Baxter.
-- First, set valid time to the intended range for Baxter's raise.
EXECUTE DBMS_WM.SetValidTime(TO_DATE('01-01-2003', 'MM-DD-YYYY'), DBMS_WM.UNTIL_CHANGED);
-- Give Baxter a raise, effective 01-Jan-2003 until changed.
UPDATE employees SET salary = 45000 WHERE name = 'Baxter';

-- Disable versioning. By default (keepWMValid parameter value of TRUE),
-- the WM_VALID column is kept, with all its data. 
COMMIT;
EXECUTE DBMS_WM.DisableVersioning ('employees');