我试图创建触发器,但是它具有编译错误。以下是我的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;
答案 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;