ORACLE PL/SQL 触发器的编程问题
Posted
技术标签:
【中文标题】ORACLE PL/SQL 触发器的编程问题【英文标题】:ORACLE PL/SQL Programming problems with trigger 【发布时间】:2016-04-22 23:12:52 【问题描述】:您好,我在运行使用 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:警告:插入 SIGHTINGS...”(我想要的) “ORA-06512:在第 7 行” "ORA-04088: 执行触发器时出错"
然后当我测试它时,没有插入到 FEATURES 表中。请帮忙。
【问题讨论】:
【参考方案1】:根据raise_application_error 上的文档:
调用时,raise_application_error 结束子程序并返回用户定义的错误号和消息给应用程序。错误号和消息可以像任何 Oracle 错误一样被捕获。
所以,首先执行另一个插入,然后引发错误。但是,如果您在触发器中引发未处理的错误,这将回滚整个事务以及对其进行的任何数据修改,并且触发器将出错。您可能需要考虑以不同的方式向用户返回消息。
【讨论】:
在引发错误的顶部移动插入部分后仍然出现错误 错误信息是分类的还是你只是希望我使用我的读心技巧? 同样的错误,ORA-06512: at line 9 and ORA-04088: error during execution of trigger. 好的!我使用了 dbms_output.put_line 而不是引发错误。非常感谢! 你可以在raise(begin, commit)之前创建一个内部事务,但是你需要知道外部事务是否执行回滚,内部插入不要被删除以上是关于ORACLE PL/SQL 触发器的编程问题的主要内容,如果未能解决你的问题,请参考以下文章