я должен реализовать следующий триггер:Mutating стол - ошибка запуска
Общее количество голосов, за год выборов, выборов после 1960 года, не превышает 538
Однако, Я получаю ошибку мутирующей таблицы. Я понимаю, почему я получаю ошибку, но я не вижу другого решения (с триггерами). Я мог бы создать временную таблицу, но я хотел бы иметь только триггер. Вот код:
CREATE OR REPLACE TRIGGER restrict_election_votes
after INSERT OR UPDATE ON election
for each row
declare
v_nbofvotes number;
v_eleyr election.election_year%type :=:NEW.election_year;
v_votes election.votes%type :=:NEW.VOTES;
begin
select sum(votes)
into v_nbofvotes
from election
where election_year=v_eleyr;
if(v_votes+v_nbofvotes >538)
THEN
RAISE_APPLICATION_ERROR(-20500, 'Too many votes');
END IF;
END;
update election
set votes=175
where candidate='MCCAIN J'
and election_year=2008;
Если удалить «для каждой строки» и сделать его триггер уровня заявления (придется изменить запрос, чтобы проверить правило для суммы (голоса) для всех выборов с 1960 года, как вы не знаете, что строка был вставлен/обновлен), тогда он должен работать. –
Я думаю, что проблема здесь не в «для каждой строки», а в выборе из себя. Просто удалите оператор select, я не думаю, что он вам действительно нужен: все, что вам нужно, это проверить: NEW.VOTES. – stee1rat
'СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТРИГГЕР limit_election_votes до ВСТАВКИ ИЛИ ОБНОВЛЕНИЯ НА выборах объявить номер v_nbofvotes; начало выбрать сумму (голосов) в v_nbofvotes с выборов where election_year> 1960; if (v_nbofvotes> (538 * ((extract (year from sysdate)) - 1960))) THEN RAISE_APPLICATION_ERROR (-20500, 'Слишком много голосов'); END IF; END; 'все еще не работает – MonicaS