【发布时间】:2015-03-18 21:33:57
【问题描述】:
我正在尝试制作一个简单的触发器,它必须在插入和更新时检查给定的值。我必须检查 ID 是否与 NAVAZUJE_NA(外键引用 ID)不同。代码如下:
CREATE OR REPLACE TRIGGER PREDMETY_INSERT_TRIGGER
BEFORE INSERT OR UPDATE ON PREDMETY
FOR EACH ROW
BEGIN
IF :NEW.ID = :NEW.NAVAZUJE_NA THEN --There is an error (PLS-00405)
RAISE_APPLICATION_ERROR(-20000, 'Predmet nemuze navazovat sam na sebe.', FALSE);
ELSIF :NEW.NAVAZUJE_NA > (SELECT MAX(ID) FROM PREDMETY) THEN
RAISE_APPLICATION_ERROR(-20001, 'Predmet nemuze navazovat na neexistujici predmet.', FALSE);
ELSIF :NEW.ID < 0 OR :NEW.NAVAZUJE_NA < 0 THEN
RAISE_APPLICATION_ERROR(-20002, 'Neplatny index predmetu nebo predmetu, na ktery ma dany predmet navazovat.', FALSE);
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('[ERROR] '||sqlerrm);
END;
感谢您的任何解决方案。
【问题讨论】:
-
我不明白你的要求。通常,表上的行级触发器无法查询该表。所以你不能在
predmety的行级触发器中运行select max(id) from predmety。您也不能以这种方式将查询放在IF子句中——您需要在IF语句之前填充一个单独的变量。并且抛出异常只是为了捕获它们并尝试将它们打印到dbms_output非常非常不可能是合理的。 -
谢谢,已解决。将错误打印到
dbms_output仅用于学术目的。 -
@Justin Cave 实际上,您可以在行级触发器中从表中运行 select max(id) 到变量中,这是可行的。它不适用于返回更多行的查询
-
@Mina - 问题不在于查询将返回的行数。问题是您通常无法在表
A的行级触发器中查询表A。是的,如果您只允许INSERT操作并且如果每个INSERT都是单行INSERT ... VALUES,那么它将起作用。但这是一个相当严格的限制。