2016-11-22 4 views
0

テーブルをチェックするトリガを作成し、条件が満たされた場合にテーブルを更新します。 、モミOracle Update Before Trigger

CELL(CellId, x0, y0, x1, y1, CurrentPhone#, MaxCalls) 
TELEPHONE(PhoneNo, x, y, PhoneState) 

そして、私のようなクエリがあります:具体的には、私は2つのテーブルを持っている

UPDATE CELL SET MaxCalls = MaxCalls-5; 

そして、私のトリガーは、CELLテーブル内のすべてのMaxCallsの合計を確認する必要があり、それは意志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; 

してください、この問題で私を助けて。ありがとうございました!

+1

はたぶん、これは後のステートメントレベルのトリガでうまくいく。すべての更新が完了した後に一度合計を確認し、<30の場合はエラーを発生させます。 – Rene

+0

ああ、ごめんなさい。 ORA-04091:表SYSTEM.CELLが突然変異していますが、トリガー/ファンクションで表示されない可能性があります。 ORA-06512:at "SYSTEM.CHANGE_MAX_CALLS"、行6 ORA-04088:トリガー 'SYSTEM.CHANGE_MAX_CALLS'の実行中にエラーが発生しました 04091. 00000 - "表%s。%sが変更されていますが、トリガー/ファンクションに" –

+0

*トリガ(またはこの文で で参照されているユーザ定義のplsql関数)は、それを起動した文によって変更された途中で だった表を参照(または変更)しようとしました。 *処置:トリガー(または関数)を書き換えて、その表を読み取らないようにしてください。 –

答えて

関連する問題