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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.