Задание:
Создать триггер,
запрещающий модификацию данных в таблицах EMP, DEPT в :
1)
НЕ рабочее
время (рабочий день с 9-00 до 18-00);
2)
Выходные;
3)
Праздничные
дни.
Решение:
create or replace trigger zapret
before update or insert or delete on EMP
for each row
declare
v
integer;
begin
if
(to_char(sysdate,'hh24') < 9) or (to_char(sysdate,'hh24') >= 18) then
raise_application_error(-20001,'Нерабочие часы. Работа запрещена.');
end if;
if (to_char(sysdate,'DY')
= 'SAT') or (to_char(sysdate,'DY') = 'SUN') then
raise_application_error(-20002,'Сегодня выходной. Работа запрещена.');
end if;
select count(*) into v
from freeday where data = sysdate;
if
v > 0 then
raise_application_error(-20003,'Сегодня праздник. Работа запрещена.');
end if;
end zapret;
create table freeday (
data
date primary key
);
Новый год:
insert into freeday values ('01.01.10');
Рождество:
insert into freeday values ('07.01.10');
Международный женский
день:
insert into freeday
values ('08.03.10');
Пасха:
insert into freeday values ('04.04.10');
День после пасхи:
insert into freeday values ('05.04.10');
Родительский
(поминальный) день:
insert into freeday
values ('11.04.10');
Международный день
труда:
insert into freeday
values ('01.05.10');
День победы:
insert into freeday values ('09.05.10');
День независимости:
insert into freeday values ('27.08.10');
День национального
языка:
insert into freeday
values ('31.08.10');
День города Кишинев:
insert into freeday values ('14.10.10');
№1. (Создать таблицу, для которой наименование и поля являются входными параметрами процедуры)
create or
replace procedure create_t (p_t in varchar2, p_d in varchar2) as
v_c integer;
q varchar2(150);
begin
v_c := DBMS_SQL.OPEN_CURSOR;
q := 'create table ' || p_t || ' ( '
|| p_d || ' )';
DBMS_SQL.PARSE(v_c,q,DBMS_SQL.NATIVE);
DBMS_SQL.CLOSE_CURSOR(v_c);
end
create_t;
begin
create_t('4elovek','rost number(3), diagnoz varchar2(20)'); end;
№2. (Определить ограничения первичного ключа (поля или полей) , используя процедуру с входными параметрами, определяющими этот ключ.)
create or
replace procedure alter_pk (p_t in varchar2, p_p in varchar2) as
v_c integer;
q varchar2(70);
begin
v_c := DBMS_SQL.OPEN_CURSOR;
q := 'alter table ' || p_t || ' add
constraint pk_' || p_t || ' primary key (' || p_p ||')';
DBMS_SQL.PARSE(v_c,q,DBMS_SQL.NATIVE);
DBMS_SQL.CLOSE_CURSOR(v_c);
end
alter_pk;
№3. (Во
временную таблицу temp, c 2-мя текстовыми полями, внести Фамилии и Имена студентов,
которые учатся на специальности major, определенной в виде
входного параметра процедуры.)
create
table temp (
name varchar2(30),
family varchar2(30)
);
create or
replace procedure intemp (p_m in varchar2) as
v_n varchar2(30);
v_f varchar2(30);
type t_c is ref cursor;
c t_c;
v integer;
x exception;
begin
open c for select first_name,
last_name from students where major=p_m;
v := 0;
loop
fetch c into v_n, v_f;
exit when c%notfound;
EXECUTE IMMEDIATE
'insert into temp values (:v_name,:v_family)'
USING v_n, v_f;
v
:= v+1;
end loop;
if v = 0 then raise x;
end if;
close c;
exception
when x then
DBMS_OUTPUT.PUT_LINE('На этом факультете нет студентов или такого факультета нет.');
close c;
end intemp;