開始日の範囲、終了日の範囲、およびその他のいくつかの列を含むテーブルがあります。新しいレコードの入力時に、重複する日付範囲を自動的に調整したい (それらを縮小、分割、または削除して、新しい入力を可能にする - 以下のアルゴリズムを参照)。また、重複するレコードが誤ってこのテーブルに挿入されないようにしたいと考えています。
アプリケーション コードに Oracle と Java を使用しています。日付範囲の重複を防止し、重複する範囲を自動的に調整できるようにするにはどうすればよいですか? データの重複を防ぐために、アクセスをシリアル化するための dbms_lock を使用して AFTER INSERT トリガーを作成する必要があります。次にJavaで、ロジックを適用してすべてを自動調整しますか? それとも、ストアド プロシージャ コールの PL/SQL にその部分を含める必要がありますか? これは、いくつかの他のテーブルに必要なものなので、抽象化するとよいでしょう。
誰かがすでにこのようなものを書いている場合は、共有してください:)
私はこの参照を見つけました: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:474221407101
以下は、4 つの重複するケースのそれぞれが、挿入時の調整のためにどのように処理される必要があるかの例です。
= Example 1 =
In DB (Start, End, Value):
(0, 10, 'X')
**(30, 100, 'Z')
(200, 500, 'Y')
Input
(20, 50, 'A')
Gives
(0, 10, 'X')
**(20, 50, 'A')
**(51, 100, 'Z')
(200, 500, 'Y')
= Example 2 =
In DB (Start, End, Value):
(0, 10, 'X')
**(30, 100, 'Z')
(200, 500, 'Y')
Input
(40, 80, 'A')
Gives
(0, 10, 'X')
**(30, 39, 'Z')
**(40, 80, 'A')
**(81, 100, 'Z')
(200, 500, 'Y')
= Example 3 =
In DB (Start, End, Value):
(0, 10, 'X')
**(30, 100, 'Z')
(200, 500, 'Y')
Input
(50, 120, 'A')
Gives
(0, 10, 'X')
**(30, 49, 'Z')
**(50, 120, 'A')
(200, 500, 'Y')
= Example 4 =
In DB (Start, End, Value):
(0, 10, 'X')
**(30, 100, 'Z')
(200, 500, 'Y')
Input
(20, 120, 'A')
Gives
(0, 10, 'X')
**(20, 120, 'A')
(200, 500, 'Y')
アルゴリズムは次のとおりです。
given range = g; input range = i; output range set = o
if i.start <= g.start
if i.end >= g.end
o_1 = i
else
o_1 = i
o_2 = (i.end + 1, g.end)
else
if i.end >= g.end
o_1 = (g.start, i.start - 1)
o_2 = i
else
o_1 = (g.start, i.start - 1)
o_2 = i
o_3 = (i.end + 1, g.end)