使用编译错误创建的触发器。无法找出错误

时间:2019-04-21 14:03:53

标签: oracle plsql database-trigger

我试图创建触发器,但是它具有编译错误。以下是我的plsql代码

 Create trigger t1 before delete on dept for each row
 Declare x number;
 Begin
 Select count(*) into x from emp where deptno 
  :=old.deptno;
  If x>0 then
  Raise_application_error(5000, 'cannot delete row');
  End if;
  End;

2 个答案:

答案 0 :(得分:2)

  

有编译错误。

您使用什么环境创建触发器?大多数客户端应该在您运行语句后立即告诉您错误消息,尽管有些确实使它比看起来合理更难。

但是,我们总是可以通过查询数据字典来发现编译错误:

select * from user_errors
where name = 'T1';

我可以在您的代码中发现的唯一明显错误是:

  

where deptno := old.deptno;

:=是PL / SQL赋值运算符。相等性的检验只是=。同样,old名称空间用冒号表示。因此,您的WHERE子句应为

where deptno = :old.deptno

这也是错误的:

  

Raise_application_error(5000, 'cannot delete row');

Raise_application_error()必须具有Oracle为用户定义的异常分配的范围内的数字,范围是-20999到-20000。顺便说一下,所有Oracle错误号均为负。


我认为此触发器是家庭作业的一部分,因为它实施了非常不好的做法。 EMP和DEPT之间的关系应该由引用DEPT的EMP上的外键强制执行。这样的触发器无法很好地扩展,并且-至关重要的-不适用于多用户环境。

答案 1 :(得分:0)

CREATE TRIGGER t1
   BEFORE DELETE
   ON dept
   FOR EACH ROW
DECLARE
   x   NUMBER;
BEGIN
   SELECT COUNT (*)
     INTO x
     FROM emp
    WHERE deptno = old.deptno;  

   IF x > 0
   THEN
      Raise_application_error (-20000, 'cannot delete row');
   END IF;
END;