Обложка канала

Oracle Developer👨🏻‍💻

Все о разработке в СУБД "Oracle" SQL, PL/SQL, оптимизация, архитектура, сертификации и многое другое.

Oracle Developer👨🏻‍💻

4 года назад
Открыть в
Ревью триггера Постановка в посте вторника. Исходный код триггера:
create or replace trigger my_tab_seq_tg
   before insert on my_tab
   for each row
begin
   if inserting then
      if :new.seq_id is null then
         select some_seq.nextval into :new.seq_id from dual;
      end if;
    end if;
end;

Начнем-с. Триггер - это PL/SQL-код, который вызывается при наступлении определенных событий, указанных в его определении. В нашем случае: триггер на операцию insert на таблицу my_tab, срабатывает для каждой новой строки (for each row) до вставки (before). В теле триггера происходит проверка с использованием функции inserting происходит ли вставка. Если поле новой строки :new.seq_id не заполнено до начала операции, то значение берется из последовательности some_seq. Опираясь на название и код, триггер предназначен только для генерации ID для некоего поля, если оно не заполнено. С этим понятно. Возникают некоторые моменты. 1️⃣ Зачем проверять, что происходит вставка (INSERTING), если триггер срабатывает только на INSERT? Ответ - абсолютно бессмысленно. 2️⃣ Зачем использовать SQL-запрос “select some_seq.nextval into :new.seq_id from dual;” для получения следующего значения, что приведет к переключению контекста между SQL и PL/SQL-машинами? Нет никакого смысла. Это вносит задержку, пусть и минимальную, в операцию insert. Такая конструкция была справедлива для старых версий Oracle, но с 11й вполне можно использовать: :new.seq_id := some_seq.nextval 3️⃣ Проверку “ :new.seq_id is null ”, можно сократить до :new.seq_id := coalesce(:new.seq_id, some_seq.nextval). А можно воспользоваться конструкцией when в условиях срабатывания: when (new.seq_id is null). Итоговый код триггера:
create or replace trigger my_tab_seq_tg
  before insert on my_tab
  for each row
  when (new.seq_id is null)
begin
  :new.seq_id := some_seq.nextval;
end;
/

Есть еще интересная холиварная тема: а зачем нам такой триггер в принципе? Коллеги в чатике отчасти это уже обсудили. Это, всего лишь, один из примеров, которые мы разбираем на курсе по Oracle PL/SQL. Если вы пишете или читаете код на PL/SQL и не раскусили суть задачи, вполне вероятно, что стоит записать на курс и добить пробелы. ⚠️ Осталось 5 мест. Если сейчас нет возможно оплатить, можно забронировать место - пишите в личку. #решениезадачи #trigger