0

データベースの開始日と終了日をチェックするPL/プロデュースを作成したいと思います。これが私のデータです

HAS_CONTRACT        DATE_FROM     DATE_TO       DURATION
---------------------------------------- --------- --------- -----------------------------
Simon Palm           20-AUG-01      19-AUG-02         0
Simon Palm          20-SEP-02       19-AUG-03         0
Flut            10-JUN-99       09-SEP-02         0
John Cliff          10-MAR-03       10-APR-04         0

ユーザーが同じdate_fromとdate_toを持つ人を入力しようとすると、それは許可されるべきではないため、例外エラーになります。これが私がどこまで行ったかですが、それは手順がどうあるべきかではないと確信しています。何か助けはありますか?

CREATE PROCEDURE insertTuple(
x contractinfo.date_from%Type,
y contractinfo.date_to%Type)
AS
BEGIN
  IF x!=y THEN 
     INSERT INTO contractInfo VALUES(x,y);
END;
/
4

1 に答える 1

2

これを強制する適切な方法は、データベースの制約を使用することです。

alter table contractors add constraint contractor_date_uk unique
    (has_contract, start_date, end_date);

これは標準的な方法であり、スケーラブルであり、マルチユーザー環境で機能し、生意気な開発者が回避することはできません。

もちろん、時間要素が日付から削除されていることを確認することが重要です。これは、トリガーで実行することも、インデックスを介して強制することもできます(制約によって使用できます。

create unique index contractor_date_uidx 
   on   contractors(has_contract, trunc(start_date), trunc(end_date));

私は請負業者の人を小切手に含めていることに注意してください-あなたの質問はその点で明確ではありません。一度に有効な請負業者を1人だけにしたい場合は、一意性の仕様からHAS_CONTRACTを削除するだけです。

もう1つは、これではオーバーラップが許可されないことです。投稿されたデータの日付範囲が重複しているので、問題ないと思います。日付範囲の重複を避けたい場合は、質問を編集してそのように言ってください。しかし、注意してください、ロジックは厄介になります。

于 2012-12-20T11:50:35.977 に答える