簡體   English   中英

Oracle更新前觸發器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM