2016-02-29 76 views
1

Oracle 12c。根据表中实例的数量限制数据输入

我目前有一个表格来存放包含医师ID,患者ID和访问数据/时间的患者访问。

我想创建一个约束条件,在输入数据时,检查特定医生是否在该给定日期有5个约会。如果医生确实有5次预约,则不能再增加预约。

除了使用存储过程进行登录之外,是否有任何方法可以执行此操作?我得到以下错误:错误(4,8):PLS-00103:在遇到一个时出现符号“UPDATE”。如果我使用存储过程(而不是触发器到期问题声明一个变量)以下::=。 (@%;?不空范围默认字符

我不能确定这是否是因为我无法在程序使用BEFORE更新任何想法

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; 
+2

触发似乎一个自然的解决方案,但它基本上是相同的想法 –

+0

我认为这可能是一个最佳途径..我试图用一个过程来做,因为我有问题用我的触发器声明一个变量,但是收到一个错误。添加到我原来的帖子。 谢谢增益 – Ian

+0

之前(或之后)仅适用于触发器,而不适用于过程。在触发器中声明变量不是问题。虽然尝试强制执行这种约束是因为并发(两个插入/更新同时不能看到对方),除非您以某种方式进行串行化,并对表问题进行变异。无论如何,这似乎是一个奇怪的约束 - 约会的数量,而不是填补的预约位。 –

回答

0

Go with trigger. Probably the best solution in this scenario.

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; 
+0

您将如何处理无法看到彼此更改的同时插入/更新?并突变表错误? –

+0

@Alex:如图所示,使用语句级别触发器,而不是行级别。 –