ELSIF无法在触发器内工作

时间:2018-04-06 16:44:02

标签: oracle plsql

我有这个简单的触发器,它检查RentalType是'M'还是'B',如果它是小写,它将它设置为高。如果它既不是那些它会抛出一个异常,但由于某些原因,当我用一个不是M或B的字母更新表时,它什么也没做。

PS小写到UPPER工作正常。

这是我的代码

CREATE OR REPLACE TRIGGER Validate_Type
BEFORE INSERT OR UPDATE ON RentalAgreement
FOR EACH ROW
DECLARE
    InvalidValue EXCEPTION;
    PRAGMA EXCEPTION_INIT(InvalidValue, -20750);
BEGIN
    IF :NEW.RentalType = 'm' OR :NEW.RentalType = 'b' THEN
        :NEW.RentalType := UPPER(:NEW.RentalType);
    ELSIF :NEW.RentalType != 'M' OR :NEW.RentalType != 'B' THEN
        RAISE InvalidValue;
    END IF;
EXCEPTION
    WHEN InvalidValue THEN
        DBMS_OUTPUT.PUT_LINE('Invalid Rental Type ' || :NEW.RentalType);
END;
/

谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

问题是你的TRIGGER正在处理你提出的EXCEPTION,但它没有被传递给触发它的DML。因此,RentalType列会正常插入。

因此,删除 EXCEPTION块或添加 RAISE

中的简单EXCEPTION语句

另外,看起来像

:NEW.RentalType != 'M' OR :NEW.RentalType != 'B'

永远是真的。

您的意思是:NEW.RentalType != 'M' AND :NEW.RentalType != 'B'吗?