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

oracle数据库:创建用于检查重复数据的PL/SQL过程,sql,oracle,stored-procedures,data-integrity,Sql,Oracle,Stored Procedures,Data Integrity,我想创建一个PL/PRODUCTS来检查数据库中的开始日期和结束日期。这是我的数据 HAS_CONTRACT DATE_FROM DATE_TO DURATION ---------------------------------------- --------- --------- ----------------------------- Simon Palm 20-AUG-01 19-AUG-02 0 Simo

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

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
如果用户试图输入一个日期_from和日期_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;
/

实施这一点的正确方法是使用数据库约束

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_合同即可


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

这是一个约束:
Alter table XXXX add constraint XXX_AK_from_to UNIQUE(date\u from,date\u to)
更好的方法是向表中添加一些约束,这样重复的数据就不会首先出现在表中!alter table mytable add constraint myconstraint unque(has_contract,date\u from,date\u to)