[英]Oracle Before Update Trigger
我想編寫一個觸發器來檢查我的表,如果條件滿足,然后對表進行更新。 具體來說,我有兩個表格:冷杉,
CELL(CellId, x0, y0, x1, y1, CurrentPhone#, MaxCalls)
TELEPHONE(PhoneNo, x, y, PhoneState)
我有一個查詢,如:
UPDATE CELL SET MaxCalls = MaxCalls-5;
我的觸發器應檢查CELL表中所有MaxCalls的總和,並且總和會大於30。如果在某個時刻,在更新MaxCalls的新值之前,MaxCalls總和小於30,則觸發器應寫一條錯誤消息並停止更新。
這是我的觸發器,但它給了我錯誤。
CREATE OR REPLACE TRIGGER Change_Max_Calls
BEFORE UPDATE ON CELL
FOR EACH ROW
DECLARE
SUMMA INTEGER;
CurrentCalls INTEGER;
cx0 INTEGER; cx1 INTEGER; cy0 INTEGER; cy1 INTEGER;
BEGIN
SELECT SUM(MaxCalls) INTO SUMMA FROM CELL;
IF (SUMMA-:NEW.MaxCalls)<30 THEN
DBMS_OUTPUT.PUT_LINE('The sum of MaxCalls should be greater than or equal to 30');
ELSE
cx0 := :OLD.x0;
cx1 := :OLD.x1;
cy0 := :OLD.y0;
cy1 := :OLD.y1;
SELECT COUNT(*) INTO CurrentCalls FROM TELEPHONE
WHERE PhoneState='Active' AND x>=cx0 AND x<cx1 AND y>=cy0 AND y<cy1;
IF :new.MaxCalls<CurrentCalls THEN
:new.MaxCalls := CurrentCalls;
END IF;
END IF;
END;
觸發器的這一部分工作良好,因為我之前已經檢查過它:
cx0 := :OLD.x0;
cx1 := :OLD.x1;
cy0 := :OLD.y0;
cy1 := :OLD.y1;
SELECT COUNT(*) INTO CurrentCalls FROM TELEPHONE
WHERE PhoneState='Active' AND x>=cx0 AND x<cx1 AND y>=cy0 AND y<cy1;
IF :new.MaxCalls<CurrentCalls THEN
:new.MaxCalls := CurrentCalls;
END IF;
請幫我解決這個問題。 謝謝!
要解決您的變異觸發器問題,您應該使用復合觸發器,您可以在before語句中進行選擇,然后在每行語句的before進行更改:
http://viralpatel.net/blogs/compound-triggers-in-oracle-11g-tutorial-example/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.