oracle数据库:创建一个检查重复数据的PL / SQL过程

时间:2012-12-20 11:34:56

标签: sql oracle stored-procedures data-integrity

我想创建一个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;
/

1 个答案:

答案 0 :(得分: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。

另一方面,这不允许重叠。您发布的数据具有重叠的日期范围,因此我认为这没关系。如果您想避免重叠日期范围,请编辑您的问题以表示;但要注意,逻辑变得粗糙。