Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6 сем / 3 / преподское / Пример_оформления_Зад_1_3_2.docx
Скачиваний:
3
Добавлен:
29.03.2025
Размер:
2.06 Mб
Скачать

4. Разработка поддерживающих процедур

/**** SQL-процедуры ****/

/***************************************************************************/

create or alter procedure COPY_PAR(pIdMain integer, pIdClass integer)

returns(oRes integer)

as

DECLARE VARIABLE vYesMain INTEGER;

DECLARE VARIABLE vPar INTEGER;

DECLARE VARIABLE vYesPar INTEGER;

begin

/*функция: Копирует параметры одного родительского класса классу - потомку

вход:pIdMain - ид. родительского класса

pIdClass -ид потомка

выход: oRes - 0 - ошибка, 1 - ОК

эффекты:

*/

select oYes from IN_GR(:pIdMain, :pIdClass)

into :vYesMain;

oRes=0;

if(:vYesMain>0) then

begin

oRes =1;

for select p1.PAR from PAR_CLASS1 p1

where p1.CLASS=:pIdMain

into :vPar

do

begin

select count(*) from PAR_CLASS1 p2

where p2.PAR=:vPar

into :vYesPar;

if(:vYesPar=0) then

insert into PAR_CLASS1 (CLASS, PAR)

values(:pIdClass,:vPar);

end

end

suspend;

end

/***************************************************************************/

/***************************************************************************/

create or alter procedure INS_PROD(pIdClass integer,pShName varchar(15),pName varchar(100))

returns(oIdProd integer,oRes integer)

as

DECLARE VARIABLE vYesClass INTEGER;

DECLARE VARIABLE vYesTerm INTEGER;

begin

/*функция: Создает новый экземпляр продукции

вход:pIdClass - ид. продукта

pShName - обозначение продукта

pName - имя продукта

выход: oIdProd - ид. нового продукта

oRes - 0 - ошибка 1 - список сформирован

эффекты: */

oRes=0;

select count(*) from CHEM_CLASS

where ID_CLASS=:pIdClass

into :vYesClass;

if(:vYesClass >0) then

begin

select count(*) from CHEM_CLASS

where MAIN_CLASS=:pIdClass

into :vYesTerm;

if(:vYesTerm=0) then

begin

oRes=1;

select oNew from GEN_ID_PROD

into :oIdProd;

insert into PROD(ID_PROD,SHORT_NAME,NAME,ID_CL,CONF)

values(:oIdProd,:pShName,:pName,:pIdClass,0);

select oRes from COPY_PAR_PROD(:oIdProd)

into :oRes;

end

end

suspend;

end

/***************************************************************************/

/***************************************************************************/

create or alter procedure COPY_PAR_PROD(pIdProd integer)

returns(oRes integer)

as

DECLARE VARIABLE vPar INTEGER;

DECLARE VARIABLE vIdClass INTEGER;

DECLARE VARIABLE vYes INTEGER;

begin

/*функция: Формирует список для значений параметров экземпляра pIdProd

вход:pIdProd - ид. продукта

выход:oRes - 0 - ошибка 1 - список сформирован

эффекты: */

oRes=0;

vYes=1;

vPar=0;

select ID_CL from PROD

where ID_PROD=:pIdProd

into :vIdClass;

for select p1.PAR from PAR_CLASS1 p1

where p1.CLASS=:vIdClass

into :vPar

do

begin

select count(*) from PAR_PROD1

where PROD=:pIdProd and PAR=:vPar

into :vYes;

if(:vYes=0) then

begin

insert into PAR_PROD1(PROD,PAR)

values ( :pIdProd,:vPar);

oRes=1;

end

else

oRes=0;

suspend;

end

end

/***************************************************************************/

/**************************************************************************/

create or alter procedure INS_PARAMETR(pShName varchar(15),pName varchar(100),pIdEI integer, pTypePar integer)

returns(oIdPar integer,oRes integer)

as

DECLARE VARIABLE vYes INTEGER;

DECLARE VARIABLE vNoTerm INTEGER;

DECLARE VARIABLE vYesNEn INTEGER;

DECLARE VARIABLE vYesEI INTEGER;

DECLARE VARIABLE vNN INTEGER;

DECLARE VARIABLE vInt INTEGER;

DECLARE VARIABLE vReal INTEGER;

begin

/*функция: Создает новый параметр и записывает его в каталог

вход:pShName - обозначение параметра

pName - имя параметра

pIdEI - ид. единицы измерения

pTypePar -ид. типа параметра

выход: oIdPar - ид. нового параметра

oRes - 0 - ошибка, 1 - ок

эффекты:

*/

oRes= 0;

vYes=0;

vNN=107; /*численное перечисление*/

vReal=112; /*real*/

vInt=111; /* int*/

vNoTerm = 0;

vYesEI = 0;

select count(*) from EI

where ID_EI= :pIdEI

into :vYesEI;

select oYes from IN_GR(:vNN,:pTypePar)

into :vYesNEn; /* параметр-перечисление*/

select count(*) from PARAMETR1

where SHORT_NAME=:pShName or NAME=:pName

into :vYes; /* есть дубль имени*/

select count(*) from CHEM_CLASS

where MAIN_CLASS= :pTypePar

into :vNoTerm; /* класс терминальный*/

if ((:vYes=0) and (:vNoTerm=0)) then /*класс терминальный и нет повтора*/

begin

if (((:pTypePar = :vReal)or(:pTypePar = :vInt)or (:vYesNEn >0))and (:vYesEI >0))then

oRes=1; /*параметр численного типа или численного перечисления*/

if ((:oRes=0) and(:vYesNEn = 0)and (:pTypePar <> :vReal) and (:pTypePar <> :vInt)) then

oRes=1; /*параметр нечисленного типа или нечисленого перечисления*/

if (:oRes=1) then

begin

select oNew from GEN_ID_PAR

into :oIdPar;

insert into PARAMETR1(ID_PAR,SHORT_NAME,NAME,EI_PAR,TYPE_P)

values(:oIdPar,:pShName,:pName,:pIdEI,:pTypePar);

end

end

suspend;

end

/***********************************************************************/

/*****************************************************************/

create or alter procedure ADD_PARAMETR_CLASS(pIdPar integer,pIdClass integer,pMinVal double precision, pMaxVal double precision)

returns(oNum integer,oRes integer,oIdClass integer)

as

DECLARE VARIABLE vYes INTEGER;

DECLARE VARIABLE vIdClass INTEGER;

begin

/*функция: Добавляет новый параметр pIdPar для класса pIdClass

вход:pIdPar - ид. параметра

pIdClass - ид.класса

pMinVal - доп. мин. значение

pMaxVal - доп. макс. значение

выход: oNum - порядковый номер параметра в списке класса

oRes - 0- операция не выполнена, 1 - операция выполнена успешно

эффекты: 1. параметр добавляется классу и всем его потомкам

*/

oRes=0;

for select oIdGr from FIND_GR_GR (:pIdClass)

into :vIdClass

do

begin

select count(*) from PAR_CLASS1

where PAR=:pIdPar and CLASS=:vIdClass

into :vYes;

if (:vYes=0) then

begin

select MAX(NUM )from PAR_CLASS1

where CLASS=:vIdClass

into :oNum;

if(:oNum is null) then oNum=0;

oNum=oNum+1;

oRes=1;

insert into PAR_CLASS1(PAR,CLASS,NUM,MAX_VAL,MIN_VAL)

values(:pIdPar,:vIdClass,:oNum,:pMaxVal,:pMinVal);

oIdClass=vIdClass;

end

else

begin

update PAR_CLASS1

set MAX_VAL=:pMaxVal,

MIN_VAL=:pMinVal

where CLASS =:vIdClass and PAR=:pIdPar;

oRes=1;

end

suspend;

end

end

/**************************************************************************/

/************************************************************************/

create or alter procedure FIND_PAR_CLASS(pIdClass integer)

returns(oIdPar integer, oShName varchar(15),oName varchar(100),oMinVal double precision,

oMaxVal double precision, oIdEi integer, oShNameEI varchar(15))

as

begin

/* функция: Находит вектор значений параметров экземпляра продукта

вход:pId

выход:

эффекты:

*/

for select PAR,MIN_VAL,MAX_VAL from PAR_CLASS1

where CLASS=:pIdClass

into :oIdPar,oMinVal,:oMaxVal

do

begin

select SHORT_NAME,NAME,EI_PAR from PARAMETR1

where ID_PAR=:oIdPar

into :oShName,:oName,:oIdEI;

select SHORT_NAME from EI

where ID_EI=:oIdEI

into :oShNameEI;

suspend;

end

end

/***********************************************************************/

/************************Проверка допустимости значения параметра *****/

create or alter procedure WRITE_PAR(pIdProd integer,pIdPar integer,pVal double precision, pStr varchar(50)

returns(oRes integer)

as

DECLARE VARIABLE vYesPar INTEGER;

DECLARE VARIABLE vIdClass INTEGER;

DECLARE VARIABLE vMinVal double precision;

DECLARE VARIABLE vMaxVal double precision;

begin

/* функция: Проверяет допустимость значения параметра экземпляра продукта и записывает его значение

вход:pIdProd - ид. продукта

pIdPar - ид. параметра

выход:oRes - 0 - ошибка, 1 - ок

эффекты:

*/

select count(*) from PAR_PROD1

where PAR= :pIdPar and PROD=:pIdProd

into :vYesPar;

oRes=1;

if(:vYesPar>0) then

begin

select ID_CL from PROD

where ID_PROD=:pIdProd

into :vIdClass;

select MIN_VAL,MAX_VAL from PAR_CLASS1

where PAR=:pIdPar and CLASS=:vIdClass

into :vMinVal,:vMaxVal;

if((:pVal>= :vMinVal) and (:pVal <= :vMaxVal)or (:pVal is null)) then

begin

oRes=1;

update PAR_PROD

set VAL=:pVal

where PROD=:pIdProd and PAR=:pIdPar;

end

else

oRes=0;

end

suspend;

end

/*****************************************************************/

/**********************************************************************/

create or alter procedure WRITE_PAR_PROD(pIdProd integer,pIdPar integer,pVal double precision, pValStr varchar(150), pEnumVal integer)

returns(oRes integer)

as

DECLARE VARIABLE vYesPar INTEGER;

DECLARE VARIABLE vIdClass INTEGER;

DECLARE VARIABLE vYesR INTEGER;

DECLARE VARIABLE vYesEn INTEGER;

DECLARE VARIABLE vYesStr INTEGER;

DECLARE VARIABLE vInt INTEGER;

DECLARE VARIABLE vReal INTEGER;

DECLARE VARIABLE vStr INTEGER;

DECLARE VARIABLE vEn INTEGER;

DECLARE VARIABLE vEI INTEGER;

DECLARE VARIABLE vTypePar INTEGER;

DECLARE VARIABLE vMinVal double precision;

DECLARE VARIABLE vMaxVal double precision;

begin

/* функция: Находит тип параметра, проверяет допустимость численного значения параметра экземпляра продукта и записывает его значение, проверяет наличие перечисления и его значения

вход:pIdProd - ид. продукта

pIdPar - ид. параметра

выход:oRes - 0 - ошибка, 1 - ок

эффекты:

*/

oRes = 0;

vInt=111;

vReal=112;

vStr=110;

vEn=106;

vEI=0;

select ID_CL from PROD

where ID_PROD=:pIdProd

into :vIdClass;

select count(*) from PAR_PROD1

where PAR= :pIdPar and PROD=:pIdProd

into :vYesPar;

if(:vYesPar>0) then /*есть параметр*/

begin

select EI_PAR, TYPE_P from PARAMETR1

where ID_PAR= :pIdPar

into :vEI,:vTypePar;

select oYes from IN_GR(:vReal,:vTypePar)

into :vYesR; /*вещественный параметр*/

select count(*) from POS_ENUM

where ID_POS = :pEnumVal and ID_ENUM = :vTypePar

into :vYesEn; /* параметр перечисления*/

select oYes from IN_GR(:vStr,:vTypePar)

into :vYesStr; /* параметр строкового типа*/

if (:vYesR >0) then

begin

select MIN_VAL,MAX_VAL from PAR_CLASS1

where PAR=:pIdPar and CLASS=:vIdClass

into :vMinVal,:vMaxVal;

if((:pVal>= :vMinVal) and (:pVal <= :vMaxVal)or (:pVal is null))

then

begin

oRes=1;

update PAR_PROD1

set VAL_R =:pVal

where PROD=:pIdProd and PAR=:pIdPar;

end

end

else

if ((:vYesStr>0) or (:vYesEn>0)) then /* параметр перечисление или строка*/

begin

oRes=1;

update PAR_PROD1

set ENUM_VAL=:pEnumVal,

VAL_STR = :pValStr

where PROD=:pIdProd and PAR=:pIdPar;

end

end

else

oRes=0;

suspend;

end

/**********************************************************************/

/***********************************************************************/

create or alter procedure FIND_PAR_PROD(pIdProd integer)

returns(oIdPar integer, oShName varchar(15),oName varchar(100),oValR double precision, oValInt integer, oShNameEI varchar(15), oValStr varchar(50),oEnumVal integer,oNameValEn varchar(20),oBlob blob)

as

DECLARE VARIABLE vIdClass INTEGER;

DECLARE VARIABLE vTypePar INTEGER;

DECLARE VARIABLE vYesPic INTEGER;

DECLARE VARIABLE vEnPic INTEGER;

begin

/* функция: Находит вектор значений параметров экземпляра продукта

вход:pIdProd - ид. изделия

выход: oIdPar - ид. параметра

oShName - обозначение параметра

oName - имя параметра

oValR - значения вещ параметра

oValStr – значение строкового параметра

oNamePic- имя изобраения

oBlob – изобраение поз.

эффекты:

*/

vEnPic = 105;

select ID_CL from PROD

where ID_PROD=:pIdProd

into :vIdClass;

for select oIdPar,oShName,oName,oShNameEI from FIND_PAR_CLASS(:vIdClass)

into :oIdPar,:oShName,:oName,:oShNameEI

do

begin

select VAL_R,VAL_STR,VAL_INT,ENUM_VAL from PAR_PROD1

where PROD=:pIdProd

and PAR=:oIdPar

into :oValR,:oValStr,:oValInt,:oEnumVal;

select TYPE_P from PARAMETR1

where ID_PAR = :oIdPar

into :vTypePar;

oNamePic= null;

oBlob = null;

oNameValEn = 0;

select oYes from IN_GR(:vEnPic,:vTypePar)

into :vYesPic;

if ( :oEnumVal is not null)then

select PIC, NAME from POS_ENUM

where ID_POS=:oEnumVal

into :oBlob, :oNameValEn;

if (:vYesPic = 0) then oBlob= null;

suspend;

end

end

/***************************************************************************/

Соседние файлы в папке преподское