我需要开发一个触发器,当字段的值不是'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;
请帮忙
答案 0 :(得分:4)
适当的方法是检查约束,而不是触发器。
也许是一个NOT NULL约束
答案 1 :(得分:4)
正如David Aldridge所说,你想要一个检查约束而不是触发器。但是,你的触发器不起作用的原因是这个条件:
IF :new.flag <>'Y' OR :new.flag <>'N' THEN
因为'Y'&lt;&gt; 'N'和'N'&lt;&gt; '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'));
答案 2 :(得分: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;