根据表中实例的数量限制数据输入
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;
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;
您将如何处理无法看到彼此更改的同时插入/更新?并突变表错误? –
@Alex:如图所示,使用语句级别触发器,而不是行级别。 –
触发似乎一个自然的解决方案,但它基本上是相同的想法 –
我认为这可能是一个最佳途径..我试图用一个过程来做,因为我有问题用我的触发器声明一个变量,但是收到一个错误。添加到我原来的帖子。 谢谢增益 – Ian
之前(或之后)仅适用于触发器,而不适用于过程。在触发器中声明变量不是问题。虽然尝试强制执行这种约束是因为并发(两个插入/更新同时不能看到对方),除非您以某种方式进行串行化,并对表问题进行变异。无论如何,这似乎是一个奇怪的约束 - 约会的数量,而不是填补的预约位。 –