我想创建一个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;
/
答案 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。
另一方面,这不允许重叠。您发布的数据具有重叠的日期范围,因此我认为这没关系。如果您想避免重叠日期范围,请编辑您的问题以表示;但要注意,逻辑变得粗糙。