【发布时间】: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;
【问题讨论】:
-
触发器似乎是一种自然的解决方案,但它的想法基本相同。
-
我认为这可能是最好的路线。我尝试使用过程来执行此操作,因为我在使用触发器声明变量时遇到问题,但是收到错误。我已将此添加到我的原始帖子中。再次感谢
-
之前(或之后)仅适用于触发器,不适用于过程。在触发器中声明变量不是问题。但是,由于并发性(两个插入/更新同时无法看到彼此),除非您以某种方式进行序列化和变异表问题,否则尝试强制执行这种约束。无论如何,这似乎是一个奇怪的限制 - 约会数量而不是约会空缺。
-
能否请您扩展“相当满的预约空档”?我假设这本身就是一个单独的表,但不确定它是如何工作的。
-
我的意思是我希望预约系统能够将患者分配到预约时段(时间段),并检查它们是否重叠(如果您喜欢的话,可能会有间隙) .仅仅计算它们并没有多大帮助 - 它们可以重叠,并且可能有不同的长度。
标签: sql stored-procedures plsql triggers oracle12c