![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
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!!;
|