Обновление той же строки в оракуле во время триггера? - PullRequest
3 голосов
/ 27 февраля 2012

Короткий вопрос, так как я не знаю, как искать это. Могу ли я «обновить» ту же строку? Например, у меня есть поле, в котором хранится общая сумма платежа, и, учитывая мои бизнес-ограничения, я могу обновить это значение. Могу ли я обновить итог той же строки с помощью всего лишь триггера? Заранее спасибо!

Кстати, я использую Oracle и PL / SQL.

Бизнес-правила: у меня есть следующее. Есть таблица, в которой магазины будут оплачивать данные, другая таблица, в которой хранятся ежемесячные платежи, и другая, в которой хранятся возможные скидки. Одна оплата может быть обесценена только один раз, а оплата будет хранить промежуточную сумму и общую сумму. Итак, что я делаю, это ... «когда информация о скидке обновляется, после ее подтверждения обновите общую стоимость и значения комиссионных».

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Вы не можете обновить таблицу, по которой запускается ваш триггер, вы получите ошибку таблицы мутаций ORA-04091.Вы можете обновлять значения в самой строке, используя синтаксис :NEW, при условии, что это триггер «до».

Хотя мне неясно, что вы имеете в виду под промежуточным итогом;Похоже, у вас есть поле с итоговой суммой на столе;если это основано на других записях в той же таблице (например, у вас есть несколько записей для одного и того же заказа, и вы хотите, чтобы вставленная запись имела сумму всех предыдущих).Если это так, то вы также не можете сделать это, так как вы нажмете ту же ORA-04901.

Если вы обновляете строку, то вы можете настроить полеустановив, например, :NEW.subtotal := :OLD.subtotal - :OLD.value + :NEW.value, но не уверен, какой будет польза от этого поля.

Было бы полезно посмотреть, какова ваша бизнес-логика и как она подходит для вставки / обновления, ичто вы хотите сделать триггер.Часто с чем-то вроде этого вы действительно хотите использовать процедуру-оболочку для вставки / обновления, а не триггер, но в настоящее время это немного расплывчато.

Чтобы подытог оставался точным, я бы, вероятно,не пытайтесь поддерживать все это, а вместо этого используйте представление, которое имеет аналитическую функцию, вычисляющую это для вас.Гораздо меньше хлопот, по моему опыту.

1 голос
/ 27 февраля 2012

Да - триггер BEFORE INSERT for each row может изменять вводимые значения.

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