Oracle триггер для создания автономера - PullRequest
12 голосов
/ 30 ноября 2011

Я никогда раньше не создавал триггер в Oracle, поэтому я ищу какое-то направление.

Я хотел бы создать триггер, который увеличивает идентификатор на единицу, если идентификатор не указан в операторе вставки.

Идентификатор должен начинаться с 10000, а когда вставляется запись, следующий идентификатор должен быть 10001. Если оператор вставки содержит идентификатор, он должен переопределить автоматическое приращение.

е

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')

должно выглядеть так:

имя, фамилия, идентификатор

Микаэль Джордан 10000

Ларри Берд 10001

insert into t1 (firstname, lastname, id) values ('Scottie','Pippen',50000)

должно выглядеть так:

имя, фамилия, идентификатор

Микаэль Джордан 10000

Ларри Берд 10001

Скотти Пиппен 50000

Ответы [ 2 ]

26 голосов
/ 30 ноября 2011

Примерно так будет работать на 11g

CREATE SEQUENCE t1_id_seq 
  start with 10000 
  increment by 1;

CREATE TRIGGER trigger_name
  BEFORE INSERT ON t1
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.id IS NULL )
  THEN
    :new.id := t1_id_seq.nextval;
  END IF;
END;

Если вы работаете в более ранней версии, вам нужно выполнить SELECT INTO, чтобы получить следующее значение из последовательности

CREATE TRIGGER trigger_name
  BEFORE INSERT ON t1
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.id IS NULL )
  THEN
    SELECT t1_id_seq.nextval
      INTO :new.id
      FROM dual;
  END IF;
END;

Имейте в виду, что в последовательностях Oracle нет пробелов. Так что вполне возможно, что конкретные значения будут пропущены по разным причинам. Ваша первая вставка может иметь идентификатор 10000, а вторая может иметь идентификатор 10020, если это было сделано через несколько минут, часов или дней.

Кроме того, учтите, что Oracle не поддерживает указание нескольких строк в предложении VALUES, как это делает MySQL. Так что вместо

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')

вам понадобятся два отдельных оператора INSERT

insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');
4 голосов
/ 05 сентября 2016

Я бы рекомендовал кодировать этот триггер с условием на самом триггере, а не в блоке sql.

CREATE OR REPLACE TRIGGER your_trigger
BEFORE INSERT ON your_table
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN (new.id IS NULL)
  BEGIN
    SELECT your_sequence.nextval
    INTO :new.id
    FROM dual;
  END;
/

При таком решении триггер выполняется только в том случае, если условие соответствует (id равен нулю).

В противном случае триггер всегда выполняется, и блок проверяет, является ли id пустым. БД должна выполнить блок SQL, который ничего не делает с ненулевыми значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...