Функции в PostgreSQL. Проектирование структуры БД сети магазинов продуктов питания, страница 6

По умолчанию в дату продажи записывается текущая дата, если не указано иначе.

В таблицу с покупателем заносится общий счет покупки и дата покупки последнего товара по текущему чеку.

В таблице с покупателем содержится  номер магазина, в котором была совершена покупка, номер чека, счет и дата покупки.

Создание функции обновления информации в каталоге магазинов.

create or replace function update_shop_catalog(integer, character varying, character varying)

  returns character as

$body$

begin

   update shop_catalog set shop_name = $2 where id = $1;

   update shop_catalog set shop_city = $3 where id = $1;

   if found then

                 perform add_log_message('magazin s id' || $1 || ' obnovlen');

                 return 'Magazin obnovlen';

   else

                 return 'Magazin ne nayden';

   end if;

end

$body$

  language plpgsql volatile

  cost 100;

alter function update_shop_catalog(integer, character varying, character varying)

  owner to postgres;

grant execute on function update_shop_catalog(integer, character varying, character varying) to public;

grant execute on function update_shop_catalog(integer, character varying, character varying) to postgres;

grant execute on function update_shop_catalog(integer, character varying, character varying) to dboperator;

select update_shop_catalog(2,'Aura','Kemerovo');

Попробуем обновить не существующий магазин:

select update_shop_catalog(5, 'Aura','Kemerovo');

Создание функции обновления информации о товарах.

При совпадении полей имя товара, производитель, цена и номер магазина, к полям количество на складе и количество проданных прибавляется значения из соответствующих полей совпавшей записи, после чего ненужная запись становится архивной (булевое arhiv=true)

create or replace function update_tovar(integer, integer, character varying, integer, integer, integer, character varying)

  returns character as

$body$

declare tmp_tovar_id int;

   tmp_count_whs int;

   tmp_count_sold_out int;

   tmp_bool boolean;

begin

   perform id from tovar where id=$1;

   if found then

   begin

                 update tovar set shop_id = $2, tovar_name = $3, tovar_price = $4, count_whs = $5, count_sold_out = $6, maker_name = $7

                 where id = $1;

                 if found then

                               begin

                               select id, count_whs, count_sold_out, arhiv  from tovar

                               where ((tovar_price =$4) and (shop_id=$2) and (tovar_name=$3) and (maker_name=$7) and (id!=$1))

                               into tmp_tovar_id, tmp_count_whs, tmp_count_sold_out, tmp_bool;

                               if ((tmp_tovar_id is not null) and (tmp_tovar_id!=$1) and (tmp_bool=false)) then

                                             begin

                                                            update tovar set count_whs = tmp_count_whs+$5,

                                                            count_sold_out = tmp_count_sold_out+$6

                                                            where id = $1;

                                                            update tovar set count_whs = 0,

                                                            count_sold_out = 0,

                                                            arhiv=true

                                                            where id = tmp_tovar_id;

                                             end;

                               else

                               end if;

                               perform add_log_message('Tovar s id' || $1 || ' obnovlen');

                               return 'Tovar obnovlen';

                               end;

                 else

                               return 'Tovar ne obnovlen';

                 end if;

   end;

   else

                 return 'Net tovara s takim ID';

   end if;

end

$body$

  language 'plpgsql' volatile

  cost 100;

alter function update_tovar(integer, integer, character varying, integer, integer, integer, character varying) owner to postgres;