我有这个简单的触发器,它检查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;
/
谢谢你的帮助。
答案 0 :(得分:1)
问题是你的TRIGGER
正在处理你提出的EXCEPTION
,但它没有被传递给触发它的DML。因此,RentalType
列会正常插入。
因此,删除 EXCEPTION
块或添加 RAISE
EXCEPTION
语句
另外,看起来像
:NEW.RentalType != 'M' OR :NEW.RentalType != 'B'
永远是真的。
您的意思是:NEW.RentalType != 'M' AND :NEW.RentalType != 'B'
吗?