嗨我运行使用ORACLE PL / SQL编程创建的触发器时遇到问题。基本上,每当插入一个数据库中不存在的位置时,我就必须在FEATURES表中插入一个新的元组。这是触发器 -
CREATE OR REPLACE TRIGGER sightTrigger
AFTER INSERT
ON SIGHTINGS
FOR EACH ROW
DECLARE
x INTEGER;
BEGIN
SELECT COUNT(*)INTO x
FROM FEATURES
WHERE FEATURES.location = :NEW.location;
IF(x=0) THEN
RAISE APPLICATION ERROR(-20001, 'Warning: Insert into the SIGHTINGS ...');
INSERT INTO FEATUERS(LOCATION,CLASS,LATITUDE<LONGITUDE,MAP,ELEV)
VALUES(:NEW.location, 'UNKNOWN', null, null, null, null);
END IF;
END sightTrigger;
它编译得很好,但我运行了一个简单的查询来测试它 -
INSERT INTO SIGHTINGS VALUES ('Douglas dustymaiden', 'Person A', 'Piute', TO_DATE('17Feb07', 'DDMONYY'));
它给了我一个错误 - “ORA-20001:警告:插入瞄准......”(我想要的是什么) “ORA-06512:第7行” “ORA-04088:执行触发时出错”
然后在我测试时没有发生插入FEATURES表。请帮忙。
答案 0 :(得分:0)
根据raise_application_error上的文档:
调用时,raise_application_error结束子程序并返回用户定义的错误号和消息给应用程序。错误号和消息可以像任何Oracle错误一样被捕获。
因此,首先执行另一个插入,然后引发错误。但是,如果在触发器中引发未处理的错误,则会回滚整个事务以及对其进行的任何数据修改,并且触发器将出错。您可能需要考虑以不同的方式向用户返回消息。