0

我想创建一个 PL/produces 来检查数据库中的开始日期和结束日期。这是我的数据

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));

请注意,我在支票中包括了承包商人员 - 您的问题在这一点上并不清楚。如果您真的一次只想要一个有效的承包商,那么只需从唯一性规范中删除 HAS_CONTRACT 。

另一件事是,这不允许重叠。您发布的数据具有重叠的日期范围,所以我认为这没关系。如果您想避免重叠的日期范围,请编辑您的问题,这样说;但请注意,逻辑变得粗糙。

于 2012-12-20T11:50:35.977 回答