oracle数据库:创建用于检查重复数据的PL/SQL过程
我想创建一个PL/PRODUCTS来检查数据库中的开始日期和结束日期。这是我的数据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
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)