У меня есть таблица EMP в моей базе данных оракула вершины, которая содержит атрибут зарплаты с именем sal. У меня есть другая таблица EMPSAL, которая имеет 3 атрибута с именами mediumSal, minSal, maxSal, которые должны обновляться с помощью триггеров всякий раз, когда какая-либо операция DML выполняется в столбце sal таблицы EMP. Вот триггер, используемый для обновления:
create or replace trigger empsal_update_trigger
AFTER update on emp
for each row
declare
avgSal2 emp.sal%type;
minSal2 emp.sal%type;
maxSal2 emp.sal%type;
begin
select avg(sal), min(sal), max(sal) into avgSal2, minSal2, maxSal2 from emp;
delete from empsal;
insert into empsal values(avgSal2, minSal2, maxSal2);
end;
Триггеры вставки и удаления работают нормально, но приведенное выше обновление выдает ошибку всякий раз, когда запись A обновляется в EMPSAL. Я пытался использовать ключевое слово before
вместо after
, но это бесполезно.
Вы пытаетесь выбрать все записи из emp, пока он обновляется в триггере. Вы не можете этого сделать. вы также удаляете каждую строку в empsal каждый раз, когда срабатывает триггер. Рекомендую прочитать документацию
Ошибка указана в заголовке.
Просьба заключалась в том, чтобы полностью указать ошибку в теле вопроса. Не пытайтесь сокращать или перефразировать его, покажите фактический пример запроса и точное сообщение об ошибке, которое выдает этот запрос.
Вместо использования триггера было бы лучше сделать EMPSAL материализованным представлением и автоматически поддерживать его с помощью встроенных функций базы данных.
Это еще одна плохо продуманная проблема с домашним заданием? Попытка сохранить AVG<что-нибудь> в таблице сама по себе является серьезным недостатком дизайна. Вы не должны хранить значения, которые могут и должны быть рассчитаны во время выполнения.
В этом случае вам не нужен триггер уровня строки, но используйте первый уровень оператора. Даже нет необходимости использовать определение локальной переменной с помощью оператора INSERT INTO ... SELECT...
.
Итак, просто удалите FOR EACH ROW
, например
CREATE OR REPLACE TRIGGER empsal_update_trigger AFTER UPDATE ON emp
BEGIN
DELETE empsal;
INSERT INTO empsal
SELECT AVG(sal), MIN(sal), MAX(sal)
FROM emp;
END;
/
"обновление, указанное выше, дает ошибку" - какая ошибка? пожалуйста отредактируйте, чтобы процитировать его полностью в теле.