2017-06-30 6 views
0

私はトリガーをコーディングして、1種類のお金しか公式に設定できないようにしています。私の意図は、コード "前の挿入または更新"のトリガーです。 INSERTセクションは正常に動作しますが、問題はUPDATINGセクションをコーディングしているためです。テーブルを更新しようとすると、ORA-04091 "mutanting table"が返されるためです。あなたは何か考えていますか?Oracle Database 10gで「IF UPDATING」トリガーをコーディングすることはできますか?

表(1レコードのみが 'Y' として設定することができます):

mon_id mon_description mon_official 
---------------------------------------------- 
    E   EUR    N 
    D   DOL    N 
    P   PES    Y 

トリガー:

CREATE OR REPLACE TRIGGER mon_oficial_ins_trg 
BEFORE 
INSERT OR UPDATE 
ON monedas 
FOR EACH ROW 
DECLARE 
    v_count NUMBER(8); 
BEGIN 
    IF INSERTING THEN 

     SELECT COUNT(mon_oficial) 
     INTO v_count 
     FROM monedas 
     WHERE mon_oficial = 'Y'; 

     IF v_count = 1 THEN 
      RAISE_APPLICATION_ERROR(
       -20010, 'Only one record can be set as 'Y''); 
     END IF; 

    END IF; 

    IF UPDATING THEN 

     SELECT COUNT(:OLD.mon_oficial) 
     INTO v_count 
     FROM monedas 
     WHERE :OLD.mon_oficial = 'Y'; 

     IF v_count = 1 AND :NEW.mon_oficial = 'Y' THEN 
       RAISE_APPLICATION_ERROR(
        -20010, 'Only one record can be set as 'Y''); 
     END IF; 

    END IF; 


END mon_oficial_ins_trg; 
/
SHOW ERRORS; 

答えて

0

あなたのコードでは2ミスが

最初

SELECT COUNT(:OLD.mon_oficial) 
     INTO v_count 
     FROM monedas 
     WHERE :OLD.mon_oficial = 'Y'; 
があります

部分、エラーをmutantingに関する情報、それは私たちの現在の行することができので、あなたが

enter link description here

と第二の間違いこの記事を読むことができ、あなたが

IF v_count = 1 AND :NEW.mon_oficial = 'Y' THEN一部で不正なロジックを持って

それを試してみてください
CREATE OR REPLACE TRIGGER mon_oficial_ins_trg 
BEFORE 
INSERT OR UPDATE 
ON monedas 
FOR EACH ROW 
DECLARE 
    v_count NUMBER(8); 
BEGIN 
    IF INSERTING THEN 

     SELECT COUNT(mon_oficial) 
     INTO v_count 
     FROM monedas 
     WHERE mon_oficial = 'Y'; 

     IF v_count = 1 THEN 
      RAISE_APPLICATION_ERROR(
       -20010, 'Only one record can be set as 'Y''); 
     END IF; 

    END IF; 

    IF UPDATING THEN 
    IF :NEW.mon_oficial = 'Y' then 
    for m in (SELECT * 
     FROM monedas 
     WHERE mon_oficial = 'Y' 
     and rownum=1) loop 

      IF :NEW.mon_id <> m.mon_id THEN 
        RAISE_APPLICATION_ERROR(
         -20010, 'Only one record can be set as 'Y''); 
      END IF; 
     END IF; 
     end loop; 
    END IF; 


END mon_oficial_ins_trg; 
/
SHOW ERRORS; 
関連する問題