МиСПрИС_Задание2_3_Петрова_Романова_Заболотников_9373
.pdfselect max_value from class_param where classProd = id_class and iIdParam = id_param into MaxVal; --Определяем макс знаения по классу
select min_value from class_param where classProd = id_class and iIdParam = id_param into MinVal; --Определяем мин знаения по классу
else
if (varProd = 2) then --Если изделие является типовым, то рассматриваем его ограничения в таблице typeprod_param и class_param
if (select id_pair from typeprod_param where iIdProd = id_prod and iIdParam = id_param) is not null then
select max_val from typeprod_param where iIdProd = id_prod and iIdParam = id_param into MaxVal; --
Определяем макс знаения по типпу
select min_val from typeprod_param where iIdProd = id_prod and iIdParam = id_param into MinVal; --
Определяем мин знаения по типу else
select max_value from class_param where classProd = id_class and iIdParam = id_param into MaxVal; --
Определяем макс знаения по классу
select min_value from class_param where classProd = id_class and iIdParam = id_param into MinVal; --
Определяем мин знаения по классу end if;
end if;
if (varProd = 3) then --Если изделие не является типовым, то рассматриваем ограничения в таблице typeprod_param и class_param для его типового продукта
select id_type_prod from product where iIdProd = id_product into vTypeProd;
if (select id_pair from typeprod_param where vTypeProd = id_prod and iIdParam = id_param) is not null then
select max_val from typeprod_param where vTypeProd = id_prod and iIdParam = id_param into MaxVal; --
Определяем макс знаения по типпу
61
select min_val from typeprod_param where vTypeProd = id_prod and iIdParam = id_param into MinVal; --
Определяем мин знаения по типу else
select max_value from class_param where classProd = id_class and iIdParam = id_param into MaxVal; --
Определяем макс знаения по классу
select min_value from class_param where classProd = id_class and iIdParam = id_param into MinVal; --
Определяем мин знаения по классу end if;
end if; end if;
if((MaxVal>=val and MinVal<=val) or (val is null)) --
Проверка введённых значений по ограниччению класса then
INSERT INTO prod_param(id_prod, id_param, id_enum_value, value) VALUES (iIdProd,iIdParam,null,val);
oRes = 1; return;
else
raise notice 'Max (%) and min(%) vffalues (%) are not correct! Look at table class_param.',MaxVal, MinVal,val;
oRes = 0; return;
end if;
else --если параметр - перечисление
select id_enum from enum_value where iIdEnumVal = id_value into vValEnum; --найдем значение перечисления для вставляемого значения
select id_enum from parameters where id_param = iIdParam into vEnumPar; --найдем значение перечисления для параметра
if(vValEnum = vEnumPar or iIdEnumVal is null) then INSERT INTO prod_param(id_prod, id_param,
id_enum_value, value) VALUES (iIdProd,iIdParam,iIdEnumVal,NULL); oRes = 1;
62
return;
else
raise exception 'id_enum_value is not correct! Please, look at table parameters.';
oRes = 0; return;
end if;
end if;
end if;
end $$ LANGUAGE plpgsql;
-- Обновление значений prod_param
CREATE OR REPLACE function update_prod_param (iIdProd int, iIdParam int, val double precision, iIdEnumVal int) RETURNS table(ORES integer) as $$
/*функция: Добавление элементов в таблицу prod_param
вход: iIdProd - ид. продукта iIdParam - ид параметра val - значение численное
iIdEnumVal - ид. значения перечисления выход: 1 - БД обновлена, 0 - Ошибка
эффекты: 1. Проверяет подходит ли под ограничения val в таблицах typeprod_param и class_param
2. Проверяет правильность перечисления через соответсвие таблицы параметров
3.Проверяет существование такой же пары параметр-продукт
4.Также запрос с несуществующим значчением перечисления
не пройдет
5. Пропустит параметр с нулевыми значениями
*/
declare flag int default 0; declare tr1 int;
declare tr2 int;
declare vEnumPar int default 0; declare vValEnum int default 0; declare varProd int default 0;
63
declare paramType int default 0; declare classProd int default 0;
declare MinVal double precision default 0; declare MaxVal double precision default 0; declare vTypeProd int default 0;
begin
select id_pair from prod_param where iIdProd = id_prod and iIdParam = id_param into flag;
if flag is null then
raise exception 'Pair with this ids does not exist'; oRes = 0;
return;
else
select id_variation from product where id_product = iIdProd into varProd; --узнаем тип продукта для ограничений параметрра
select id_type_prod from product where iIdProd = id_product into vTypeProd;
--Если это ваиация прродукта и передан типовой параметр, то обновляем значение, иначче - нет
if (select id_pair from typeprod_param where id_prod = vTypeProd and id_param = iIdParam) is not null or varProd != 3 then
if (select id_paramType from parameters where id_param = iIdParam limit 1) = 1 then --если параметр является ччисленным
select id_class from product where id_product = iIdProd into classProd; --узнаем класс продукта для ограничений параметрра
--(если это типовой продукт или вариант
конфигуации
--, то typeProd = 2 или 3)
if (varProd != 2 and varProd != 3) then
select max_value from class_param where classProd = id_class and iIdParam = id_param into MaxVal; --Определяем макс знаения по классу
select min_value from class_param where classProd = id_class and iIdParam = id_param into MinVal; --Определяем мин знаения по классу
else
64
if (varProd = 2) then --Если изделие является типовым, то рассматриваем его ограничения в таблице typeprod_param и class_param
if (select id_pair from typeprod_param where iIdProd = id_prod and iIdParam = id_param) is not null then
select max_val from typeprod_param where iIdProd = id_prod and iIdParam = id_param into MaxVal; --Определяем макс знаения по типпу
select min_val from typeprod_param where iIdProd = id_prod and iIdParam = id_param into MinVal; --Определяем мин знаения по типу
else
select max_value from class_param where classProd = id_class and iIdParam = id_param into MaxVal; --
Определяем макс знаения по классу
select min_value from class_param where classProd = id_class and iIdParam = id_param into MinVal; --
Определяем мин знаения по классу
end if;
end if;
if (varProd = 3) then --Если изделие не является типовым, то рассматриваем ограничения в таблице typeprod_param и class_param для его типового продукта
if (select id_pair from typeprod_param where vTypeProd = id_prod and iIdParam = id_param) is not null then
select max_val from typeprod_param where vTypeProd = id_prod and iIdParam = id_param into MaxVal; --Определяем макс знаения по типпу
select min_val from typeprod_param where vTypeProd = id_prod and iIdParam = id_param into MinVal; --Определяем мин знаения по типу
else
select max_value from class_param where classProd = id_class and iIdParam = id_param into MaxVal; --
Определяем макс знаения по классу
65
select min_value from class_param where classProd = id_class and iIdParam = id_param into MinVal; --
Определяем мин знаения по классу
end if; end if;
end if;
if((MaxVal>=val and MinVal<=val) or (val is null)) --Проверка введённых значений по ограниччению класса
then
update prod_param set value = val where iIdProd = id_prod and iIdParam = id_param; --Обновим значение в записи
oRes = 1; return;
else
raise exception 'Max (%) and min(%) values
(%) are not correct! Look at table class_param.',MaxVal, MinVal,val; oRes = 0;
return; end if;
else --если параметр - перечисление
select id_enum from enum_value where iIdEnumVal = id_value into vValEnum; --найдем значение перечисления для вставляемого значения
select id_enum from parameters where id_param = iIdParam into vEnumPar; --найдем значение перечисления для параметра
if(vValEnum = vEnumPar or iIdEnumVal is null)
then
update prod_param set id_enum_value = iIdEnumVal where iIdProd = id_prod and iIdParam = id_param; --Обновим значение в записи
oRes = 1; return;
else
raise exception 'id_enum_value is not correct! Please, look at table parameters.';
oRes = 0;
66
return; end if;
end if;
else
raise exception 'You have to update typeParameters. You can not update another parameters.';
oRes = 0; return;
end if; end if;
end $$ LANGUAGE plpgsql;
--Удаление пары prod_param
CREATE OR REPLACE function delete_prod_param (
IdToDelete integer) RETURNS VOID
as $$
/*функция: Удаление элемента из таблицы prod_param
вход: IdToDelete - ид. пары, котоую нужно удалить выход: 1 - БД обновлена, 0 - Ошибка эффекты: 1. Проверка на существование удаляемой записи
*/ begin
if(select count(*) from prod_param where IdToDelete = id_pair) is not null then
DELETE FROM prod_param WHERE IdToDelete = id_pair;
else
raise exception 'Pair with this id does not exist. DB wasnt
updated.'; end if;
end $$ LANGUAGE plpgsql;
----------------------------------------------------------------------
Процедуры
----------------------------------------------------------------------
CREATE OR REPLACE function COPY_PAR_PROD (
PIDPROD integer)
returns table( RES integer)
67
as $$
declare VPAR integer; declare VIDCLASS integer; declare VYES integer; declare flag integer; declare f record;
declare typeProd integer;
declare vEnumV integer; declare vVal integer; begin
/*функция: Формирует список для значений параметров экземпляра pIdProd
по классу продукта
вход:pIdProd - ид. продукта
выход:oRes - 0 - ошибка 1 - список сформирован эффекты: */
Res=1;
if(select id_type_prod from product where id_product = PIDPROD) is
null then --Если это изделие без конфигураций или типовое, то список не заполняется
select id_class from product where id_product=pIdProd
into vIdClass; --Узнаём класс продукта |
|
for f in select id_param from class_param |
--Перебираем все |
параметры для данного класса |
|
where id_class = vIdClass |
|
loop |
|
vPar = f.id_param; |
|
select count(*) from prod_param --Смотрим, есть ли такие параметры уже в таблице продукт-значениеПараметра
where id_prod = pIdProd and id_param = vPar into vYes;
if(vYes=0) then --Если нет, то вставляем
select oRes from add_prod_param(PIDPROD, vPar, null, null) limit 1 into flag;
if flag = 1 then
68
Res = 1;
else
Res = 0; end if;
else
Res=0; end if;
end loop;
else --Если это вариация изделия, то классовые параметры заполнятся втоматически потиповому параметру
select id_type_prod from product where id_product = PIDPROD into typeProd; --Найде типовой паараметр
select id_class from product where id_product = typeProd into vIdClass;--Найдем класс типового параетра
for f in select id_param from class_param |
--Перебираем все |
параметры для класса типового параметра |
|
where id_class = vIdClass |
|
loop |
|
vPar = f.id_param; |
|
select count(*) from prod_param --Смотрим, есть ли такие параметры уже в таблице продукт-значениеПараметра
where id_prod = pIdProd and id_param = vPar into vYes;
--Выберем типовые значения
select id_enum_value, value from prod_param where typeProd = id_prod and vPar = id_param into vEnumV, vVal;
if(vYes=0) then --Если нет, то вставляем
select oRes from add_prod_param(PIDPROD, vPar, vVal, vEnumv) limit 1 into flag;
if flag = 1 then
Res = 1;
else
Res = 0; end if;
69
else
Res=0; end if;
end loop; end if;
return next;
end $$ LANGUAGE plpgsql;
/******* |
Изменения в процедуре создания изделия |
************/ |
CREATE OR |
REPLACE function INS_PROD ( |
|
nameOfNewProduct text, |
|
|
idClassOfNewProduct integer, |
|
|
idTypeProd integer, |
|
|
idVar |
integer) |
|
returns table ( pRES integer)
as $$
/*функция: Вставляет новый продукт и формирует для него список параметров
вprod_param исходя из таблицы class_param
вход:nameOfNewProduct - наименование продукта idClassOfNewProduct -класс продукта idTypeProd - Ссылка на типовй продукт idVar - Вариант конфигурации
выход:oRes - 0 - ошибка 1 - список сформирован
эффекты: */
declare VYESCLASS integer; declare VYESTERM integer; declare oIdProd integer; begin
select * from add_product(nameOfNewProduct,idClassOfNewProduct,idTypeProd,idVar) into oIdProd; --Вызов стандартной функции создания изделия
select c.Res from COPY_PAR_PROD(oIdProd) as c --Вызов функции копирования параметров из класса
70