3.6 有効期間サポートを使用した問合せおよびDML操作
この項では、有効期間サポートに関連する問合せおよびデータ操作言語(挿入、更新および削除)操作の動作と考慮事項について説明します。
3.6.1 問合せ
有効期間サポートを伴うバージョン対応表に対して発行される問合せすべてで、現行のセッションの有効期間設定(SetValidTimeプロシージャまたはSetValidTimeFilterONプロシージャを使用して設定)が考慮されます。問合せで別に指定(たとえば、「有効期間サポートの演算子」で説明した有効期間サポート演算子の1つを使用)しないかぎり、各問合せでは、基礎となる表のうち有効期間の範囲がセッションの有効期間または有効期間フィルタとオーバーラップしている行と、問合せのその他の条件を満たす行がすべて表示されます。
デフォルトでは(つまり、セッションでSetValidTimeプロシージャをコールしていない場合、またはパラメータを指定せずにコールした場合)、現時点で有効なすべての行が有効であるとみなされ、現時点から後が制限なしで有効期間とみなされます。
親トピック: 有効期間サポートを使用した問合せおよびDML操作
3.6.2 データ操作言語(DML)操作
有効期間サポートを伴うバージョン対応表に対して発行されるすべてのDML文(INSERT、UPDATEおよびDELETE)では、現行のセッションの有効期間設定および更新モードが考慮されます。(更新モードはSetWMValidUpdateModeONプロシージャおよびSetWMValidUpdateModeOFFプロシージャによって制御されます。) DML文は、有効期間において有効な行すべてに影響する可能性があります。
デフォルトでは(つまり、セッションでSetValidTimeプロシージャをコールしていない場合、またはパラメータを指定せずにコールした場合)、現時点で有効なすべての行をDML文で操作でき、変更後のすべての行では有効期間範囲のタイムスタンプが現時点から変更時までとして設定されます。
以降の各項では、特定タイプのDML操作に適用される付加的な考慮事項について説明します。
親トピック: 有効期間サポートを使用した問合せおよびDML操作
3.6.2.1 更新操作
有効期間サポートを伴うバージョン対応表の更新操作は、順序付けしても順序付けしなくてもかまいません。
順序付き更新操作が発生するのは、UPDATE文でWM_VALID列の変更を指定しない場合です。順序付き更新操作の場合、行のWM_VALID.ValidTill値は現行セッションの有効期間範囲のValidFromタイムスタンプに変更され、新規の行が作成されて、そのWM_VALID期間に現行セッションの有効期間範囲が反映されます。順序付き更新では、WM_VALID列の値が異なるため、UPDATE文により重複レコードが作成されないことが保証されます。
例3-13に、順序付き更新操作を示します。この操作では、従業員Baxterが昇給しています。更新前には、Baxterに関して給与(40000)と有効期間(2000年1月1日から変更時まで)が設定された1行があります。
例3-13 順序付き更新操作
-- 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';
例3-13の更新操作では、次の文に示すように、既存の行のWM_VALID値が変更され、新規の給与値とセッションの有効期間範囲を反映するWM_VALID値を使用して新規の行が作成されます。
-- Set valid time to encompass virtually all time.
EXECUTE DBMS_WM.SetValidTime(TO_DATE('01-01-1900', 'MM-DD-YYYY'), TO_DATE('01-02-9999', 'MM-DD-YYYY'));
-- See what data exists for Baxter.
SELECT * FROM employees WHERE name = 'Baxter';
NAME SALARY
---------------- ----------
WM_VALID(VALIDFROM, VALIDTILL)
--------------------------------------------------------------------------------
Baxter 45000
WM_PERIOD('01-JAN-2003 12:00:00 -04:00', NULL)
Baxter 40000
WM_PERIOD('01-JAN-2000 12:00:00 -04:00', '01-JAN-2003 12:00:00 -04:00')
順序付き削除操作では、セッションの有効期間範囲内にある行の一部が削除されます。つまり、現行セッションの有効期間範囲が反映されたWM_VALID期間の新しい行が作成された後に、その行が削除されます。例3-13のUPDATE文が、DELETE FROM employees WHERE name = 'Baxter';である場合、2003年1月1日から変更時まで有効なBaxterの新しい行は削除されますが、2003年1月1日以前に有効なBaxterのすべての行は影響を受けません。順序なし削除操作の概念はありません。たとえば、例3-13で有効期間が設定されていない場合、削除操作WHERE name = 'Baxter'ではBaxterのすべての行が削除されます。
順序付き更新および削除操作が有効になるのは、有効期間サポートを伴うバージョン対応表の場合、またはバージョン対応表に有効期間サポートが追加された場合です。ただし、SetWMValidUpdateModeOFFプロシージャを使用して、順序付きと順序なしの更新操作、および順序付き削除操作のサポートを無効にできます。また、これらのサポートを再度有効にするには、SetWMValidUpdateModeONプロシージャを使用します。(これらのプロシージャの詳細は、「DBMS_WMパッケージ: リファレンス」を参照してください。)
順序なし更新操作が発生するのは、UPDATE文でWM_VALID列の変更を指定する場合です。順序なし更新操作では、行は追加作成されず、更新後の行のWM_VALID列の値には、UPDATE文に指定した値が反映されます。順序なし更新操作の結果、同じ主キー値を持つ複数の行が、UPDATE文に指定した期間中に有効にならないことを確認する必要があります。これを確認しないと、主キー制約違反が原因で更新に失敗します。
例3-13のUPDATE文は順序なし更新操作だったため、実行結果はBaxterに関する行が1行のみとなっています。既存の行の給与は45000に設定され、WM_VALID列はUPDATE文に指定した期間に設定されます。
親トピック: データ操作言語(DML)操作
3.6.2.2 挿入操作
有効期間サポートを伴うバージョン対応表に1行を挿入する場合に、その行の有効期間を指定できます。期間にNULLのタイムスタンプを指定すると、セッションの有効期間が使用されます。
有効期間サポートを伴うバージョン対応表に1行が挿入されると、Workspace Managerでは、同じ主キー値を持つ既存の行の有効期間範囲が、新規に挿入された行の有効期間範囲とオーバーラップしていないことが確認されます。このような行が検出されると、例外が発生します。例3-14に、有効期間がオーバーラップしているために主キー制約違反となる挿入操作を示します。
例3-14 期間のオーバーラップが原因で失敗する挿入操作
-- Insert. Should violate primary key constraint, because of overlapping times:
-- existing Coleman row is valid from 01-Jan-2003 until 31-Dec-9999.
INSERT INTO employees VALUES(
'Coleman',
55000,
WMSYS.WM_PERIOD(TO_DATE('01-01-2004', 'MM-DD-YYYY'),
TO_DATE('12-31-9999', 'MM-DD-YYYY'))
);
)
*
ERROR at line 6:
ORA-20010: unique key violation
ORA-06512: at "WM_DEVELOPER.OVM_INSERT_10", line 1
ORA-04088: error during execution of trigger 'WM_DEVELOPER.OVM_INSERT_10'
例3-14に示した文を正常に実行するには、最初にColemanの行のWM_VALID.ValidTill属性を、2004年1月1日以前の日付を反映するタイムスタンプに変更します。
親トピック: データ操作言語(DML)操作