必须声明'RAISERROR'

时间:2017-12-05 21:21:38

标签: mysql sql triggers database-trigger

CREATE TRIGGER x AFTER INSERT ON itemtype 
FOR EACH ROW
DECLARE 
    minn itemtype.PRICE%type;
BEGIN 
select MIN(itemtype.PRICE) into minn from itemtype;
IF (:new.PRICE > minn*4) then RAISERROR('Custom text');
END IF;
END;
/  

我正在尝试创建一个触发器,当我尝试在itemtype中插入一个新条目时,itemtype.PRICE列值大于当前低价商品的4倍表

当我尝试创建触发器时,我收到了这些编译错误。

LINE/COL ERROR
-------- --------------------------------------------------------------
5/31     PL/SQL: Statement ignored
5/31     PLS-00201: identifier 'RAISERROR' must be declared

我也试过

    CREATE TRIGGER x AFTER INSERT ON itemtype 
    FOR EACH ROW
    DECLARE 
        minn itemtype.PRICE%type;
    BEGIN 
    select MIN(itemtype.PRICE) into minn from itemtype;
    if (:new.PRICE > minn*4) then raise_application_error(-20010,'Too Expensive');
    END IF;
    END;
    /

符合,但当我尝试在表中插入一个新条目时,我得到了错误,说我的触发器失败了。

    SQL> insert into itemtype(ITEMNUM,NAME,PICTURE,PRICE,BELONGSTO ) VALUES ('A11','The who knows','',10.99,'P');
    insert into itemtype(ITEMNUM,NAME,PICTURE,PRICE,BELONGSTO ) VALUES ('A11','The who knows','',10.99,'P')
                *
    ERROR at line 1:
    ORA-04091: table USERNAME.ITEMTYPE is mutating, trigger/function may not see it
    ORA-06512: at "USERNAME.X", line 5
    ORA-04088: error during execution of trigger 'USERNAME.X'

1 个答案:

答案 0 :(得分:0)

尝试在触发器中使用PRAGMA AUTONOMOUS_TRANSACTION。

在这个问题上看看我的答案: SQL trigger on delete mutating table