Таблица EMP видоизменяется, триггер/функция может не увидеть ее ошибку

У меня есть таблица 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, но это бесполезно.

"обновление, указанное выше, дает ошибку" - какая ошибка? пожалуйста отредактируйте, чтобы процитировать его полностью в теле.

underscore_d 21.12.2020 17:36

Вы пытаетесь выбрать все записи из emp, пока он обновляется в триггере. Вы не можете этого сделать. вы также удаляете каждую строку в empsal каждый раз, когда срабатывает триггер. Рекомендую прочитать документацию

OldProgrammer 21.12.2020 17:37

Ошибка указана в заголовке.

Muhammad Bilal 21.12.2020 17:40

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

IMSoP 21.12.2020 17:46

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

APC 21.12.2020 18:47

Это еще одна плохо продуманная проблема с домашним заданием? Попытка сохранить AVG<что-нибудь> в таблице сама по себе является серьезным недостатком дизайна. Вы не должны хранить значения, которые могут и должны быть рассчитаны во время выполнения.

EdStevens 21.12.2020 22:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
6
270
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме