В oracle есть два уровня триггеров: уровень строки и уровень таблицы.
Триггеры уровня строки выполняются for each row
. Триггеры уровня таблицы выполняются для каждого оператора, даже если оператор изменил более одной строки.
В триггере уровня строки вы не можете выбрать / обновить саму таблицу, в которой есть триггер: вы получите ошибку с мутацией.
В этом случае нет необходимости в выражении UPDATE. Просто попробуйте это:
CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
:new.quote_expiration_date=sysdate+90;
END;
/
EDIT Раджеш упомянул, что, возможно, перед вставкой новой строки OP хочет обновить все остальные записи в таблице aso_quote_headers_all
.
Ну, это выполнимо, но это немного сложно. Чтобы сделать это правильно, вам понадобится
- Пакет pl / sql и переменная в заголовке пакета, которая изменяется триггерами. Эта переменная может быть списком, содержащим идентификаторы вновь вставленных записей. Уровень строки после триггера вставки добавит новый идентификатор в список. Содержимое этой переменной пакета будет различным для каждого отдельного сеанса, поэтому давайте назовем эту переменную
session_variable
.
- Уровень строки после триггера вставки, который добавит новый идентификатор к
session_variable
.
- Уровень таблицы после триггера вставки, который будет получать идентификаторы из
session_variable
, обработать идентификатор и затем удалить его из session_variable
. Этот триггер может выполнить необходимые выборки / обновления для aso_quote_headers_all. После обработки вновь вставленного идентификатора этот триггер должен убедиться, что он удален из session_variable
.