Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Третья команда помимо добавления пяти записей включала в себя удаление пятисот тысяч. Высокое время выполнения 4-й и 5-й команд объясняются значительной степенью фрагментации БД после удаления, хотя видна тенденция улучшать результат с каждым разом (оптимизатор-то не дремлет). Ну и «полный вакуум» с опцией анализа в комментариях не нуждается («лучше день потерять, зато потом за пять минут долететь»).
Нужно указать еще одну особенность: PostgreSQL выполняет кэширование функций, и при этом использует не имена таблиц, а их OID (Object Identifier). В результате, если теперь удалить таблицу test1, а потом создать ее повторно, то попытка выполнить функцию inserter завершится неудачей:
ERROR: связь с OID 29481 не существует
CONTEXT: PL/pgSQL function "inserter" line 10 at SQL statement
Чтобы восстановить работоспособность функции, ее придется пересоздать, повторно выполнив команду «create or replace function…».
Теперь несколько слов о триггерных функциях. От обычных они отличаются тем, что тип возврата у них должен быть обязательно trigger:
create [or replace] function <имя функции>(<аргументы>)
returns trigger as ‘<тело функции>’
language ‘plpgsql’
Соответственно команды return, встречающиеся в теле функции, должны возвращать данные именно этого типа, который, по сути, является типом RECORD, то есть возвращает запись таблицы. Как правило, в качестве параметра возврата выступают специальные переменные NEW (новое значение модифицируемой записи) и OLD (старое значение), которые передаются в триггерную функцию автоматически.
Вот мы и подошли к решению задачи, поставленной в начале статьи. Нужные таблицы уже созданы. Заполним их некоторыми значениями:
insert into goods(goods, rest) values(‘Клавиатура’, 15);
insert into goods(goods, rest) values(‘Мышь’, 25);
insert into goods(goods, rest) values(‘Монитор’, 5);
insert into warehouse(goods_id, count) values(1, 30);
insert into warehouse(goods_id, count) values(2, 30);
insert into warehouse(goods_id, count) values(3, 7);
Далее создаем триггерную функцию, которая будет выполняться после вставки новой записи в таблицу orders (здесь приведено только тело функции):
DECLARE
whcount warehouse.count%type;
rscount integer;
rsorders integer;
row reserved%rowtype;
BEGIN
--определяем количество на складе
select count into whcount