根据表中的实例数限制数据输入
Posted
技术标签:
【中文标题】根据表中的实例数限制数据输入【英文标题】:Limit data input based on count of instances in table 【发布时间】:2016-02-29 22:43:26 【问题描述】:甲骨文 12c。
我目前有一个表格来保存患者就诊,其中包含医生 ID、患者 ID 和就诊数据/时间。
我想创建一个约束,在数据输入时检查特定医生在给定日期是否有 5 次预约。如果医生确实有 5 次预约,则不能再添加预约。
除了使用存储过程进行输入之外,还有其他方法吗?
如果我要使用存储过程(而不是由于声明变量的问题而触发),我会收到以下错误:Error(4,8): PLS-00103: Encountered the symbol "UPDATE" when expecting a以下: := 。 ( @ % ; 非空范围默认字符
我不确定这是否是因为我不能在程序上使用 BEFORE UPDATE。有什么想法吗?
CREATE OR REPLACE PROCEDURE doc_apt_limit_5
IS
v_visit_count
BEFORE UPDATE OR INSERT ON aa_patient_visit
FOR EACH ROW
BEGIN
SELECT (COUNT(*)) INTO v_visit_count
FROM aa_patient_visit
WHERE physid = :NEW.physid
GROUP BY physid, visittime;
IF v_visit_count > 4 THEN
RAISE_APPLICATION_ERROR(-20001, 'physician is fully booked on this date');
END IF;
END;
【问题讨论】:
触发器似乎是一种自然的解决方案,但它的想法基本相同。 我认为这可能是最好的路线。我尝试使用过程来执行此操作,因为我在使用触发器声明变量时遇到问题,但是收到错误。我已将此添加到我的原始帖子中。再次感谢 之前(或之后)仅适用于触发器,不适用于过程。在触发器中声明变量不是问题。但是,由于并发性(两个插入/更新同时无法看到彼此),除非您以某种方式进行序列化和变异表问题,否则尝试强制执行这种约束。无论如何,这似乎是一个奇怪的限制 - 约会数量而不是约会空缺。 能否请您扩展“相当满的预约空档”?我假设这本身就是一个单独的表,但不确定它是如何工作的。 我的意思是我希望预约系统能够将患者分配到预约时段(时间段),并检查它们是否重叠(如果您喜欢的话,可能会有间隙) .仅仅计算它们并没有多大帮助 - 它们可以重叠,并且可能有不同的长度。 【参考方案1】:使用触发器。在这种情况下可能是最好的解决方案。
CREATE OR REPLACE TRIGGER doc_apt_limit_5 BEFORE
UPDATE OR
INSERT ON aa_patient_visit FOR EACH ROW
DECLARE v_visit_count PLS_INTEGER;
BEGIN
SELECT COUNT(*)
INTO v_visit_count
FROM aa_patient_visit
WHERE physid = :NEW.physid
GROUP BY physid,
visittime;
IF v_visit_count > 4 THEN
RAISE_APPLICATION_ERROR(-20001, 'physician is fully booked on this date');
END IF;
END;
【讨论】:
您将如何处理无法看到彼此更改的同时插入/更新?和变异表错误? @Alex:让我们使用语句级触发器而不是行级触发器,如图所示。以上是关于根据表中的实例数限制数据输入的主要内容,如果未能解决你的问题,请参考以下文章