Работа с oracle database 11g

Уважаемые пикабушники. Может быть, среди Вас найдется специалист в области pl sql, который сможет пояснить некоторые нюансы в построении DML, compound триггеров, сможет объяснить, как правильно интерпретировать и избежать мутации в таблицах БД.
p.s. Есть своя БД, написанная в учебных целях, а также несколько идей триггеров, сложность реализации которых требует помощи.

0
Автор поста оценил этот комментарий

Если задача не слишком замудренная. Давно ораклом баловался

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Суть триггера в том, что мне нужно следить за наличием товара и не собирать заказ, состоящий из более 100 единиц товара. Как я понимаю, нужно работать с таблицей Заказано

Вот код, который я написал для этой задачи:

Create or replace trigger Zadanie

Before insert or update or delete

On Zakazano

for each row

Declare

Col_zakaz Exception;

abc Zakazano.num%TYPE;

Begin

Select count(num) into abc from Zakazano where p_code =:new.p_code;

If abc > 100 then raise Col_zakaz;

End if;

Exception

When Col_zakaz then raise_application_error (-20008, 'Невозможно добавить в заказ более 100 единиц товара');

End Zadanie;

/

num - количество из таблицы Заказано, p_code - код товара

p.s. Жаль не могу прикрепить фото

показать ответы
0
Автор поста оценил этот комментарий

В триггере нельзя обращаться селектом к той таблице, на которой триггер. Иначе ошибка мутации. Воркэраунд простой - сделай отдельную процедуру и из триггера вызывай ее через dbms_job.submit(…)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Буду пробовать, спасибо
0
Автор поста оценил этот комментарий

Не напрямую, но пошлёт скорее всего - запрос к той же таблице на count.


Всё академически, простой случай. Описано тут. Только не спрашивай зачем package, по сути для переменных.


stevenfeuersteinonplsql.blogspo_t.com/2016/12/get-rid-of-mutating-table-trigger.html

https://oracle-base.com/articles/9i/mutating-table-exception...

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Я как понимаю, в пакет мы должны сразу записать переменную, потому что мутация происходит из-за того, что идёт обращение к переменной таблицы, которую ещё не записали?
показать ответы
1
Автор поста оценил этот комментарий

Суть триггера в том, что мне нужно следить за наличием товара и не собирать заказ, состоящий из более 100 единиц товара. Как я понимаю, нужно работать с таблицей Заказано

Вот код, который я написал для этой задачи:

Create or replace trigger Zadanie

Before insert or update or delete

On Zakazano

for each row

Declare

Col_zakaz Exception;

abc Zakazano.num%TYPE;

Begin

Select count(num) into abc from Zakazano where p_code =:new.p_code;

If abc > 100 then raise Col_zakaz;

End if;

Exception

When Col_zakaz then raise_application_error (-20008, 'Невозможно добавить в заказ более 100 единиц товара');

End Zadanie;

/

num - количество из таблицы Заказано, p_code - код товара

p.s. Жаль не могу прикрепить фото

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Только select без count: select num into abc ...
показать ответы
0
Автор поста оценил этот комментарий

Нет, это херня, проблема mutating triggers, а значит там что-то обновляется чуть ли не из запрашиваемого.


А, понял, смотрю коммент.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Суть в том, как использовать результаты запроса в триггере, а точнее случай, когда нужно использовать подзапрос в запросе. Документация oracle вроде как запрещает это делать
показать ответы
0
Автор поста оценил этот комментарий

Это в любом учебнике и курсе есть, ты по делу пиши - что конкретно не стыкуется или сложнее чем там. Общее правило про PK Update ВООБЩЕ в СУБД - never do it как бы на уровне проектировки, а не способы обхода.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
В комментарии уже отписал суть проблемы - использование запроса в триггере
показать ответы
0
Автор поста оценил этот комментарий

Если задача не слишком замудренная. Давно ораклом баловался

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

В данном случае, я как понимаю, должна быть мутация записей?)

0
Автор поста оценил этот комментарий

Любопытно :)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Можете помочь?)
показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества