МиСПрИС_Задание2_3_Петрова_Романова_Заболотников_9373
.pdfmax_val integer, --Наибольшее возможное значение min_val integer , --наименьшее возможное значение
CONSTRAINT id_param FOREIGN KEY (id_param)
REFERENCES Parameters (id_param) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE
)
ALTER TABLE TypeProd_Param ADD CONSTRAINT id_prod FOREIGN KEY (id_prod)
REFERENCES public.Product (id_product) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE cascade;
create unique index TypeProdParam on TypeProd_Param(id_prod, id_param);
--------------------------------------------------------СОПРОВОЖДАЮЩИЕ ФУНКЦИИ--------------------------------------------------------
--Создание перечисления
CREATE OR REPLACE function add_enum ( new_enum_name text)
RETURNS int
/*функция: Создание перечисления вход: new_enum_name - Имя перечисления выход: 1 - БД обновлена, 0 - Ошибка
эффекты: 1. Если уже существует перечисление с таким именем, то перечисление не создаётся.
*/
as $$
declare ind int default 0; begin
select id_enum from enumeration where new_enum_name = name_enum into ind;
if ind is not null then
raise notice 'Enumeration with this name already exists. Db was not updated';
ind:=0;
21
return ind;
else
INSERT INTO enumeration(name_enum) VALUES ($1); ind:= 1;
return ind; end if;
end $$ LANGUAGE plpgsql;
--Удаление перечисления
CREATE OR REPLACE function delete_enum ( delete_id integer) RETURNS int
/*функция: Удаление перечисления
вход: delete_id - Id перечисления, которое надо удалить выход: 1 - БД обновлена, 0 - Ошибка
эффекты: 1. Если перечисления с таким id нет, то БД не обновится и будет выведена ошибка
*/ as $$
declare ind int default 0; begin
select id_enum from enumeration where delete_id = id_enum into
ind;
if ind is not null then
DELETE FROM enumeration WHERE id_enum = delete_id; ind:= 1;
return ind;
else
raise notice 'Enumeration with this id does not exist. Db was not updated';
ind:= 0; return ind;
end if;
end $$ LANGUAGE plpgsql;
-- Добавление значения в перечисление create or replace function add_value (
new_value_name text, new_id_enum integer
22
)
returns int
/*функция: Добавление значения в перечисление
вход: new_value_name - имя значения, которое будет добавлено new_id_enum - id перечисления, к которому добавлеяется
значение выход: 1 - БД обновлена, 0 - Ошибка
эффекты: 1. Если перечисления с таким id нет, то БД не обновится и будет выведена ошибка
2. Если такое значение уже есть в перечислении, то оно добавлено не будет
*/ as $$
declare new_num integer; declare ind_id int default 0; declare ind_rep int default 0; begin
select id_enum from enumeration where new_id_enum = id_enum into ind_id;
select id_value from enum_value where name_value = new_value_name and id_enum = new_id_enum into ind_rep;
if ind_id is null then
raise notice 'This enumerator does not exist. DB was not
updated.';
return 0;
else
if ind_rep is not null then
raise notice 'This value already exists in this enumeration.DB was not updated.';
return 0;
else
if ((select COUNT(*) from enum_value where id_enum = $2) = 0) then--Если в перечислении ещё нет значений,
--то порядковый номер значения будет 1 new_num:= 1;
else
select MAX(num)+1 from enum_value where id_enum = $2
into new_num;
23
end if;
insert into enum_value(num, name_value, id_enum) VALUES (new_num, $1, $2);
return 1; end if;
end if;
end $$ LANGUAGE plpgsql;
-- Удаление значения из перечисления
CREATE OR REPLACE function delete_enum_value ( delete_id integer) RETURNS int
/*функция: Удаления значения из перечисления
вход: delete_id - id значения, которое будет удалено выход: 1 - БД обновлена, 0 - Ошибка
эффекты: 1. Если значения с таким id нет, то БД не обновится и будет выведена ошибка
*/ as $$
declare ind int default 0; declare idEnum int default 0; declare numd int default 0; begin
select id_value, num, id_enum from enum_value where id_value = delete_id into ind, numd, idEnum;
if ind is not null then
update enum_value set num = num-1 where num> numd and id_enum = idEnum;
DELETE FROM enum_value WHERE id_value = delete_id;
return 1;
else
raise notice 'The value with this id does not exist.DB was not updated.';
return 0; end if;
end $$ LANGUAGE plpgsql;
-- Добавление позиции заказа
24
create or replace function add_pos_order ( oIdOrder integer,
oIdProduct integer, oQ integer
)
returns int
/*функция: Добавление позиции заказа вход: oIdOrder - ид. Заказа
oIdProduct - ид. продукта oQ - количество продукта
выход: 1 - БД обновлена, 0 - Ошибка
эффекты: 1. Если заказа с таким id нет, то БД не обновится и будет выведена ошибка
2. Если такое значение уже есть в перечислении, то оно добавлено не будет
*/ as $$
declare new_num integer; declare ind_id int default 0; declare ind_rep int default 0; begin
select id_order from orderr where oIdOrder = id_order into ind_id; --Проверка на наличие заданного заказа
select id_order from pos_order where oIdProduct = id_prod and oIdOrder = id_order into ind_rep; --Проверка повторного внесения продукта в заказ
if oq <= 0 then
raise notice 'Q can not be less or equal 0'; return 0;
else
if ind_id is null then
raise notice 'This enumerator does not exist. DB was
not updated.';
return 0;
else
if ind_rep is not null then
raise notice 'This value already exists in this enumeration.DB was not updated.';
25
return 0;
else
if ((select id_order from pos_order where oIdOrder = id_order) is null) then--Если в перечислении ещё нет значений,
--то порядковый номер значения будет 1 new_num:= 1;
else
select MAX(num)+1 from pos_order where oIdOrder = id_order into new_num;
end if;
insert into pos_order(id_order, id_prod, num, q) VALUES ($1, $2, new_num, $3);
return 1; end if;
end if; end if;
end $$ LANGUAGE plpgsql;
-- Удаление позиции в заказе
CREATE OR REPLACE function delete_pos_order ( oIdOrder integer, oIdProd integer) RETURNS int
/*функция: Удаления позиции в заказе
вход: delete_id - id позиции в заказе, которая будет удалена выход: 1 - БД обновлена, 0 - Ошибка
эффекты: 1. Если значения с таким id нет, то БД не обновится и будет выведена ошибка
*/ as $$
declare pIdPair int default 0; declare pNum int default 0; begin
select id_pair, num from pos_order where oIdOrder = id_order and oIdProd = id_prod into pIdPair, pNum;
if pIdPair is not null then
update pos_order set num = num-1 where num> pNum and id_order = oIdOrder;
DELETE FROM pos_order WHERE id_pair = pIdPair;
26
return 1;
else
raise notice 'The value with this id does not exist.DB was not updated.';
return 0; end if;
end $$ LANGUAGE plpgsql;
-- Добавление элементов в таблицу shd
CREATE OR REPLACE function add_shd ( nameOfShd text) RETURNS VOID as $$
declare flag int default 0; begin
if (select id_shd from shd where nameShd = nameOfShd) is not null then
raise exception 'Shd with this names already exists' ;
else
INSERT INTO shd(nameShd) VALUES ($1); end if;
end $$ LANGUAGE plpgsql;
--Удаление варианта из shd
CREATE OR REPLACE function delete_shd (
ShdIdToDelete integer) RETURNS VOID
as $$ begin
if(select id_shd from shd where ShdIdToDelete = id_shd) is not null then
DELETE FROM shd WHERE id_shd = ShdIdToDelete;
else
raise exception 'Shd with this id does not exist. DB wasnt
updated.'; end if;
end $$ LANGUAGE plpgsql;
27
-- Добавление элементов в таблицу ORDERR
CREATE OR REPLACE function add_order (oIdShd integer, oDateReg date) RETURNS VOID
as $$
declare flag int default 0; begin
select id_order from orderr where oIdShd = id_shd and oDateReg = date_reg into flag;
if flag is not null then
raise exception 'Order with this shd and date reg already
exists'; else
INSERT INTO orderr (id_shd, date_reg) VALUES ($1, $2); end if;
end $$ LANGUAGE plpgsql;
--Удаление варианта из ORDERR
CREATE OR REPLACE function delete_order (
OrderIdToDelete integer) RETURNS VOID
as $$ begin
if(select id_order from orderr where OrderIdToDelete = id_order) is not null then
DELETE FROM orderr WHERE id_order = OrderIdToDelete;
else
raise exception 'Order with this id does not exist. DB wasnt
updated.'; end if;
end $$ LANGUAGE plpgsql;
-- Добавление элементов в таблицу type_param
CREATE OR REPLACE function add_typeParam (nameOfPT text) RETURNS VOID as $$
declare flag int default 0;
28
begin
select id_paramtype from type_param where name_paramtype = nameOfPT into flag;
if flag is not null then
raise exception 'Type with this names already exists';
else
INSERT INTO type_param(name_paramtype) VALUES ($1); end if;
end $$ LANGUAGE plpgsql;
--Удаление варианта из type_param
CREATE OR REPLACE function delete_typeParam (
PTIdToDelete integer) RETURNS VOID
as $$ begin
if(select id_paramtype from type_param where PTIdToDelete = id_paramtype) is not null then
DELETE FROM type_param WHERE PTIdToDelete = id_paramtype;
else
raise exception 'type_param with this id does not exist. DB wasnt updated.';
end if;
end $$ LANGUAGE plpgsql;
---Добавление нового парамметра
CREATE OR REPLACE function add_parameter (
PNAME text,
PUOM integer, PTYPEPAR integer, pIdEnum integer
)
returns integer as $$
declare vYES int; declare vIdEnum int; declare vIdUOM int;
29
declare oRes int; begin
/*функция: Создание нового параметра вход: PSHNAME - обозначение параметра,
PNAME - имя параметра,
PUOM - единица измерения парметра,
PTYPEPAR - тип параметра (1 - численный, 2 - перечисление, 3 -
агрегат),
pIdEnum - ид. перечисления эффекты:
требования:
1.для типов 1,3 pIdEnum=0,
2. Для типов 2,3 PUOM=0*/ oRes=1;
select count(*) from parameters where name_param = pName into vYes;
if (vYes=0) then
if (pTypePar=1) then vIdEnum=null;
else vIdEnum=pIdEnum; end if;
if(pTypePar=2) then vIdUOM = null;
else
vIdUOM = PUOM;
end if;
insert into parameters(name_param,id_uom,id_paramtype,id_enum) values(pName, vIdUOM,pTypePar,vIdEnum);
else
oRes=0;
end if;
return oRes;
end $$ LANGUAGE plpgsql;
30