Триггер создан с ошибками компиляции.Невозможно найти ошибку - PullRequest
0 голосов
/ 21 апреля 2019

Я пытался создать триггер, но у него есть ошибки компиляции. Ниже мой код 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 ]

2 голосов
/ 21 апреля 2019

есть ошибки компиляции.

Какую среду вы используете для создания триггера? Большинство клиентов должны сообщить вам сообщение об ошибке, как только вы запустите оператор, хотя некоторые действительно усложняют его, чем кажется разумным.

Однако мы всегда можем найти ошибки компиляции, запросив словарь данных:

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 должна обеспечиваться внешним ключом в EMP, ссылающимся на DEPT. Подобные триггеры плохо масштабируются и, что крайне важно, не работают в многопользовательской среде.

0 голосов
/ 22 апреля 2019
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;  
...