@remkudusov

Почему в oracle pl/sql триггер не реагирует на все строки, которые я вставляю в таблицу?

Здравствуйте!
У меня в Oracle PL/SQL есть такая таблица:
SWe1O.png
Это таблица выстрелов. У меня есть люди, которые участвуют в соревновании по меткости в стрельбе. Колонка name описывает имя стрелка, колонка x показывает координату точки попадания пули x, а колонка y показывает координату точки попадания пули y. Подразумевается, что данные будут вноситься сразу по три строчки после того, как выстреливает каждая команда, состоящая из 3 человек. Вот как выглядит запрос вставки результатов выстрела:
insert all 
into shots (name, x, y)
values ('Bill', 12, 61)
into shots (name, x, y)
values ('Marat', 150, 85)
into shots (name, x, y)
values ('Ivan', 18, 13)
select * from dual;

И тут есть одно ограничение. Нельзя записывать в таблицу результат, в котором x > 120. Поэтому был написан триггер, который отменяет вставку строки, у которой x > 120. Вот его код:
create or replace trigger delet_shot
    before INSERT on shots
for each row
begin
    if (:new.x > 120) then
        raise_application_error(-20000, 'Стрелок не попал в мишень');
    end if;
end;

И теперь, собственно, в чём суть вопроса. Когда я выполняю вставку в таблицу, продемонстрированную выше, у меня из-за того, что в запросе присутствует строка, которая не может быть вставлена из-за триггера, не вставляются две остальные строки (1 и 3), которые правильные и под действия триггера не подпадают. Скажите пожалуйста, как это исправить и написать триггер, который в одной вставке будет пускать все правильные строки и не пускать неправильные. То есть, чтобы 1 и 3 строка, так как они правильные, были вставлены в таблицу, а 2 строка не была вставлена, так как она неправильная. Спасибо!
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg
Баянист. Тамада. Услуги.
Запрос идет одной транзакцией - если в нем что-то портится, откатывается вся транзакция.
Шлите отдельными транзакциями.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы