Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Create procedure total_nakl (id_nakl integer)






RETURNS (NAKL_SUM DOUBLE PRECISION)

AS

BEGIN

SELECT SUM(O.KOLVO*T.TOV_CENA) as TOTAL

FROM OTPUSK O, TOVAR T

WHERE (O.NAKL_ID = 1) and (O.TOV_ID = T.ID_TOV)

INTO: NAKL_SUM;

EXIT;

END!!

SET TERM;!!

Проверим ее работу при помощи ISQL:

EXECUTE PROCEDURE TOTAL_NAKL(1);

И вторая – возвращающая цену заданного товара:

SET TERM!!;

CREATE PROCEDURE GET_TOV_CENA (TOV_ID integer)

RETURNS (T_CENA FLOAT)

AS

BEGIN

SELECT TOV_CENA

FROM TOVAR

WHERE (ID_TOV =: TOV_ID)

INTO: T_CENA;

EXIT;

END!!

SET TERM;!!

Создадим триггера AFTER INSERT, UPDATE и BEFORE DELETE для таблицы OTPUSK:

SET TERM!!;

CREATE TRIGGER OTPUSK_AU FOR OTPUSK

AFTER UPDATE AS

DECLARE VARIABLE NAKL_TOT DOUBLE PRECISION;

DECLARE VARIABLE O_CENA FLOAT;

DECLARE VARIABLE N_CENA FLOAT;

BEGIN

IF(OLD.NAKL_ID < > NEW.NAKL_ID) THEN EXCEPTION OTPUSK_CHN_NAKL_ID;

ELSE

IF((OLD.KOLVO < > NEW.KOLVO) OR (OLD.TOV_ID < > NEW.TOV_ID)) THEN BEGIN

IF(OLD.TOV_ID < > NEW.TOV_ID) THEN

BEGIN

UPDATE TOVAR SET TOV_KVO = (TOV_KVO + OLD.KOLVO)

WHERE (ID_TOV = OLD.TOV_ID);

UPDATE TOVAR SET TOV_KVO = (TOV_KVO - NEW.KOLVO)

WHERE (ID_TOV = NEW.TOV_ID);

END

ELSE

UPDATE TOVAR SET TOV_KVO = (TOV_KVO + OLD.KOLVO - NEW.KOLVO)

WHERE (ID_TOV = OLD.TOV_ID);

EXECUTE PROCEDURE TOTAL_NAKL(OLD.NAKL_ID) RETURNING_VALUES: NAKL_TOT;

EXECUTE PROCEDURE GET_TOV_CENA(OLD.TOV_ID) RETURNING_VALUES: O_CENA;

EXECUTE PROCEDURE GET_TOV_CENA(NEW.TOV_ID) RETURNING_VALUES: N_CENA;

UPDATE NAKL SET NAKL_ITOG = (: NAKL_TOT -: O_CENA*OLD.KOLVO +: N_CENA*NEW.KOLVO)

WHERE (ID_NAKL = OLD.NAKL_ID);

END

END!!

SET TERM;!!

А также триггер

SET TERM!!;

CREATE TRIGGER OTPUSK_AI FOR OTPUSK AFTER INSERT

AS

DECLARE VARIABLE NAKL_TOT DOUBLE PRECISION;

DECLARE VARIABLE N_CENA FLOAT;

DECLARE VARIABLE T_KVO INTEGER;

BEGIN

SELECT TOV_KVO FROM TOVAR

WHERE (ID_TOV = NEW.TOV_ID)

INTO: T_KVO;

IF(: T_KVO > = NEW.KOLVO) THEN

BEGIN

EXECUTE PROCEDURE TOTAL_NAKL(NEW.NAKL_ID) RETURNING_VALUES: NAKL_TOT;

EXECUTE PROCEDURE GET_TOV_CENA(NEW.TOV_ID) RETURNING_VALUES: N_CENA;

UPDATE TOVAR SET TOV_KVO = (TOV_KVO - NEW.KOLVO)

WHERE (ID_TOV = NEW.TOV_ID);

UPDATE NAKL SET NAKL_ITOG = (: NAKL_TOT +: N_CENA*NEW.KOLVO)

WHERE (ID_NAKL = NEW.NAKL_ID);

END

END!!

 

SET TERM;!!

И триггер для удаления записи:

SET TERM!!;

CREATE TRIGGER OTPUSK_AD FOR OTPUSK AFTER DELETE

AS

DECLARE VARIABLE NAKL_TOT DOUBLE PRECISION;

DECLARE VARIABLE O_CENA FLOAT;

BEGIN

EXECUTE PROCEDURE TOTAL_NAKL(OLD.NAKL_ID) RETURNING_VALUES: NAKL_TOT;

EXECUTE PROCEDURE GET_TOV_CENA(OLD.TOV_ID) RETURNING_VALUES: O_CENA;

UPDATE TOVAR SET TOV_KVO = (TOV_KVO + OLD.KOLVO)

WHERE (ID_TOV = OLD.TOV_ID);

UPDATE NAKL SET NAKL_ITOG = (: NAKL_TOT -: O_CENA*OLD.KOLVO)

WHERE (ID_NAKL = OLD.NAKL_ID);

END!!

SET TERM;!!

Осталось написать такие же триггера для таблицы NAKL

SET TERM!!;






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.