Пятница, 10.01.2025, 13:52
Приветствую Вас Гость | RSS

Lab#3 (Триггер)

Задание:

 

Создать триггер, запрещающий модификацию данных в таблицах 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;