2016-02-29 77 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:如圖所示,使用語句級別觸發器,而不是行級別。 –