触发

时间:2016-04-22 23:12:53

标签: oracle plsql oracle11g

嗨我运行使用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('17­Feb­07', 'DD­MON­YY'));

它给了我一个错误 - “ORA-20001:警告:插入瞄准......”(我想要的是什么) “ORA-06512:第7行” “ORA-04088:执行触发时出错”

然后在我测试时没有发生插入FEATURES表。请帮忙。

1 个答案:

答案 0 :(得分:0)

根据raise_application_error上的文档:

  

调用时,raise_application_error结束子程序并返回用户定义的错误号和消息给应用程序。错误号和消息可以像任何Oracle错误一样被捕获。

因此,首先执行另一个插入,然后引发错误。但是,如果在触发器中引发未处理的错误,则会回滚整个事务以及对其进行的任何数据修改,并且触发器将出错。您可能需要考虑以不同的方式向用户返回消息。