Чтобы все записи имели одинаковое значение из последовательности, один раз на INSERT
, вы можете использовать глобальную переменную в составном триггере.
Создать тестовую таблицу и последовательность:
create table my_table(
my_column number,
other_column number
)
/
create sequence my_seq
/
Создать триггер:
CREATE OR REPLACE TRIGGER my_trigger
FOR INSERT
ON my_table
COMPOUND TRIGGER
g_value NUMBER;
BEFORE STATEMENT
IS
BEGIN
g_value := my_seq.NEXTVAL;
END BEFORE STATEMENT;
BEFORE EACH ROW
IS
BEGIN
:new.my_column := g_value;
END BEFORE EACH ROW;
END;
/
Теперь продемонстрируйте
insert into my_table values(null, 10)
/
insert into my_table values(null, 20)
/
insert into my_table
select cast(null as number) my_column, level other_column from dual connect by level < 10
/
insert into my_table values(null, 40)
/
Результаты:
select * from my_table
/
MY_COLUMN OTHER_COLUMN
--------- ------------
1 10
2 20
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
4 40
Обратите внимание, что все средние строки имеют значение 3 в качестве значения MY_COLUMN
.
Часть BEFORE STATEMENT
получает одно значение из последовательности. Часть BEFORE EACH ROW
присваивает одно и то же значение каждой строке, на которую воздействует инструкция.
Проблема с попыткой сделать это с помощью триггера уровня оператора в Oracle состоит в том, что у вас нет доступа к списку затронутых записей, поэтому вы не можете сказать «установить номер группы для записей 5,6,7». , 8,9 и 10 "