2

我需要开发一个触发器,当字段的值不是“Y”或“N”时触发。我的代码在下面,它不起作用

CREATE OR REPLACE TRIGGER ONLY_Y_N
BEFORE INSERT OR UPDATE OF flag
ON checktable
FOR EACH ROW
BEGIN
IF :new.flag <>'Y' OR  :new.flag <>'N' THEN
RAISE_APPLICATION_ERROR(-20100, 'Please insert Y  or N ');
END IF;
END ONLY_Y_N;

请帮忙

4

3 回答 3

4

合适的方法是检查约束,而不是触发器。

也许还有一个 NOT NULL 约束

于 2012-06-07T12:11:14.550 回答
4

正如大卫奥尔德里奇所说,你想要一个检查约束而不是触发器。但是,您的触发器不起作用的原因是这种情况:

IF :new.flag <>'Y' OR  :new.flag <>'N' THEN

因为 'Y' <> 'N' 和 'N' <> 'Y' 这永远不会是真的!你需要:

IF :new.flag <>'Y' AND  :new.flag <>'N' THEN

或更简洁地说:

IF :new.flag not in ('Y', 'N') THEN

所以检查约束解决方案是:

alter table checktable add constraint only_y_n check (flag in ('Y', 'N'));
于 2012-06-07T12:15:06.567 回答
1

很简单:你应该有AND而不是OR. 无论FLAG. 更好的是,NOT IN改用:

IF :new.flag NOT IN ('Y', 'N') THEN
    RAISE_APPLICATION_ERROR(-20100, 'Please insert Y  or N ');
END IF;
于 2012-06-07T12:15:43.060 回答