ORA-00036: рекурсивная ошибка уровня SQL - PullRequest
0 голосов
/ 06 мая 2018

Я создал представление, используя 'emp' и 'dept' таблицу.

create or replace view view_test (emp_name,dept_name,location) as
select e.emp_name,d.dept_name,d.location from emp e,dept d
where e.DEPT_NO=d.DEPT_NO;

И 'INSTEAD OF' trigger:

CREATE OR REPLACE TRIGGER TRIG_TEST
INSTEAD OF UPDATE ON VIEW_TEST
FOR EACH ROW
BEGIN
UPDATE VIEW_TEST
SET LOCATION=:NEW.LOCATION
WHERE DEPT_NAME=OLD.DEPT_NAME;
END;
/

Когда я пытаюсь обновить значение в VIEW_TEST, я получаю следующую ошибку:

update view_test
set location ='ASIA'
WHERE DEPT_NAME='HR';

ORA-00036: максимальное количество рекурсивных уровней SQL (50) превышено

Может кто-нибудь, пожалуйста, помогите мне ..

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Ниже приведен правильный код триггера, который решит вашу проблему, попробуйте его сейчас.

CREATE OR REPLACE TRIGGER TRIG_TEST
INSTEAD OF UPDATE ON VIEW_TEST
FOR EACH ROW
BEGIN
UPDATE dept
SET LOCATION=:NEW.LOCATION
WHERE DEPT_NO = (select dept_no
                      from dept 
                     where DEPT_NAME=:OLD.DEPT_NAME
                       and rownum <=1);
END;
/
0 голосов
/ 06 мая 2018

INSTEAD OF TRIGGER полезно, когда вы знаете конкретную логику для обработки DML операции на VIEW. Как правило, если представление содержит несколько объединений в таблицах, и мы хотим убедиться, что Oracle должен обрабатывать такие вставки / обновления в базовых таблицах представления, рекомендуется использовать такой триггер.

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

Я думаю, что вы на самом деле пытались обновить dept таблицу. Итак, вы можете переписать свой Trigger, чтобы он выглядел примерно так.

CREATE OR replace TRIGGER trig_test
  INSTEAD OF UPDATE ON view_test
  FOR EACH ROW
BEGIN
    UPDATE dept
    SET    location  = :NEW.location -- include other columns
    WHERE  dept_name = :OLD.dept_name;
END;
/  

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

update view_test set location ='ASIA' WHERE DEPT_NAME='HR';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...