Программа модификации полей таблицы детали-поставщики, страница 2

1)  вставка не происходит, если нет детали или изделия указанного в поставке в таблицах p и j.

2)  Если информация есть, то если нет поставщика в S, вставляем в S указанного поставщика с рейтингом = 50% от минимального со значением null в остальных полях

Решить задачу с использованием триггеров и процедур.

Create trigger add_in_spj

insert on spj referencing new as new_str

For each row

(execute procedure1(new_str.n_post,...);

Execute procedure2(...))

Create procedure1(n_postav char(6),n_detail char(6),n_izdel char(6))

Define minimum int;

Select min(reiting) into minimum from s;

Let minimum=minimum/2;

If(select count(*) from p where p.n_det=n_detail)=0 then

Elif(select count(*) from j where n_izd=n_izdel)=0 then

Elif(select count(*) from s where n_psot=n_postav)=0 then

Insert into s values(n_postav,null,minimum,null)

Endif

End procedure

Create procedure procedure2(n_detail char(6)

If (select count(*) from p where p.n_det=n_detail)=0) then

Delete from spj where n_det=n_detail

Elif(select count(*) from j where n_izd=n_izdel)=0)

Delete from spj where n_izd=n_izdel

Endif

End procedure

8) №6. Отслеживается удаление строк из таблицы поставщиков s. При удалении некоторого поставщика его поставки из таблицы spj связываются с поставщиками с минимальным рейтингом того же города, если таковой имеется, в противном случае – удаляется.

Create trigger delete_s delete on s referencing old as old_st

For each row(execure procedure ud(old_st.n_post, old_st.town))

Create procedure ud(n_p char(6), gor char(15))

Define f int;

Let f=0;

If(select count(*) from s where s.town=gor)=0) then

Delete from spj where s.n_psot=n_p

Else let f=1

Endif;

If(f=1) then update spj

Set n_post = (select n_post from s x where

x.reiting=(select min(reiting) from s where town=gor))

where n_post=n_p

endif

end procedure

9(?????) Отслеживается соблюдение ограничений целостности при выполнении операции модификации строк в таблице изделий spj, проверяя соответствие обновляемых полей номера поставщика, номера детали и номера изделия соответствующим значениям из таблиц s,p,j. В случае отсутствия вставляемых значений указанных полей в таблицах s,p,j, модификация игнорируется.

Select * from j where not n_izd in

(select n_izd from spj where not n_post in

(select n_post from s where

reiting<(select avg(reiting) from s)))


10) Выбрать (без повторов) номера поставщиков, для которых количество поставок какой-либо детали этим поставщиком = количеству изделий.

Create trigger reit update of kol on spj

referencing old as orig new as upd

before(execute old_sum( ));

for each row (execute procedure on_update (upd.n_post, upd.kol, orig.kol)

after (execute reit_raise( ));

create procedure oldsum()

create table tmp(n_post char(5),new_kol smallint, old_kol smallint)

insert into temp select distinct n_post,sum(kol)

from spj group by n_post;

end procedure

create procedure on_update(num_post char(5), new_k int)

update tmp set new_kol_new_kol+new_k where n_post = num_post

end procedure

create procedure reit_raise()

define new_k smallint;

define old_k smallint;

foreach select new_kol,old_kol into new_k,old_k from tmp;

if(new_k>0.5*old_k) then

update s set reiting=1.25*reiting;

else

continue

endif;

end foreach;

drop table tmp;

end procedure

11) выбрать из р  где n_det выбрать с сортировкой из spj, где n_izd выбрать из j, где город – Лондон, причем группировать n_post,n_det. Количество n_izd= кол-ву изделий из Лондона.

Лондон  - J5 J7

S2 S3

S5 P5

Найти все о деталях, которые поставляются.

12) №14. Отследить выполнение операции модификации поля «город» в таблице р. Новое значение города должно быть из списка городов таблиц s,p,j. При несоблюдении указанных условий, модификация отвергается.

Create trigger H update of town оn p referencing old as original referencing new as copy

For each row(when(select count(*) from s,copy where s.town = copy.town=0) and (select  count(*) from p,copy where p.town = copy.town = 0) and (select  count(*) from j,copy where j.town = copy.town = 0)

(insert into p,original values(original.n_det,original.town)

13) №16.

Select n_izd from j jx where not exists

(select * from spj, spjy where spjy.n_izd=jx.n_izd)

and spjy.n_post!=”S2”)

union

select n_izd from spj group by n_izd having

avg(kol)<(select avg(kol) from spj)