Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МиСПрИС_Задание2_3_Петрова_Романова_Заболотников_9373

.pdf
Скачиваний:
23
Добавлен:
20.06.2023
Размер:
1.3 Mб
Скачать

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

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