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

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

 returns character as

$body$

declare g_id int;

              tmp_tovar_id int;

begin

              select id from shop_catalog where id=$1 into tmp_tovar_id;

              if (tmp_tovar_id is null) then

                            return 'Net magazinov po zadannomu ID';

                            else

                            begin

                            select tovar_price from tovar where ((shop_id=$1) and (tovar_name=$2) and (maker_name=$6)) into tmp_tovar_id;

                            if (tmp_tovar_id is null) then

                                           insert into tovar (shop_id, tovar_name, tovar_price, count_whs, count_sold_out, maker_name)

                                           values($1,$2,$3,$4,$5,$6);

                            else

                                           begin

                                           update tovar set count_whs=count_whs+$4 where tovar_name=$2;

                                           end;

                                           end if;

                                           select currval('tovar_id_seq') into g_id;

                                   perform add_log_message('tovar "' || $2 || '" dobavlen po id ' || g_id);

                                           return 'Tovar dobavlen';

                            end;

              end if;

end

$body$

  language plpgsql volatile

  cost 100;

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

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

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

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

Добавим товар krossovki, производителя nike в магазин с индексом 2, ценой 1200, количеством на складе 25 и количеством уже проданных — 6. (количество проданных не равно 0, чтобы было легче выполнять дальнейшие запросы. Можно не вводить количество проданных товаров, оно автоматически запишется как ноль).

select add_tovar(2,'krossovki',1200,25,6,'nike');

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

select add_tovar(14,'krossovki', 1200,25,6,'nike');

Создание функции удаления товара из таблицы tovar:

Удаление, если этот товар ни разу не был продан.

create or replace function remove_tovar(integer)

  returns character as

$body$

declare tmp_id int;

begin

           select id from tovar where id=$1 into tmp_id;

           if (tmp_id is null) then

           return 'Ne nayden tovar po zadannomu id';

           else     

                          begin

                          delete from tovar where id=$1;

                          select currval('shop_catalog_id_seq') into tmp_id;

                          perform add_log_message('udaleno po id ' || tmp_id);

                          return 'Tovar udalen';

                          end;

           end if;

end

$body$

  language plpgsql volatile

  cost 100;

alter function remove_tovar(integer) owner to postgres;

grant execute on function remove_tovar(integer) to public;

grant execute on function remove_tovar(integer) to postgres;

grant execute on function remove_tovar(integer) to dboperator;

select remove_tovar(3);

Попробуем удалить товар, который уже был когда-то продан:

select remove_tovar(1);

Ошибка!

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

При добавлении информации о продаже, автоматически заполняется таблица с информацией о каждом покупателе.

create or replace function add_sold_out(integer, integer, integer, integer, timestamp without time zone)

  returns character as

$body$

declare b_id int;

   tmp_shop_id int;

   tmp_tovar_id int;

   tmp_tovar_count int;

   tmp_tovar_price int;

   tmp_bill int;

   tmp_bill_1 int;

   tmp_buyer_id int;

   tmp_bool boolean;