Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СБД_Курсач_отчёт.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
171.52 Кб
Скачать

Создание триггера

Триггер должен регистрировать ввод, указывая идентификатор спонсора, пользователя и время ввода.

CREATE OR REPLACE TRIGGER sponsor_inserting

BEFORE INSERT ON sponsor

FOR EACH ROW

BEGIN

INSERT INTO PubReg VALUES

('INSERT',:new.snum, user, to_char(sysdate,'dd.mm.yyyy hh24:mi:ss'));

dbms_output.put_line('В таблицу sponsor добавлена строка.');

END;

Таблица учёта вставки нового пользователя:

CREATE TABLE PubReg

(

operation VARCHAR2(10),

SponsorNum NUMBER(4),

user_name VARCHAR2(20),

user_date VARCHAR2(20)

);

--формирует автоматически первичный ключ при вставке строк в таблицу Спонсор

CREATE OR REPLACE TRIGGER Sponsor_inc

BEFORE INSERT ON sponsor

FOR EACH ROW

BEGIN

SELECT spSeq.NEXTVAL INTO :new.snum FROM dual;

END;

--формирует автоматически первичный ключ при вставке строк в таблицу издательство

CREATE OR REPLACE TRIGGER Publisher_inc

BEFORE INSERT ON publisher

FOR EACH ROW

BEGIN

SELECT PubSeq.NEXTVAL INTO :new.pnum FROM dual;

END;

Результат выполнения триггера:

Создание представления

Представление PublView позволяет запрашивать данные из обеих (связанных) таблиц. Для ограничения доступа к данным по столбцам выберем только следующие столбцы: Имя спонсора, название издательства. Для ограничения доступа к данным по строкам выберем только строки, где спонсором не является ГазПром.

Скрипт createview.sql

CREATE OR REPLACE VIEW PublView AS

SELECT sname AS Спонсор,pname AS ИздательствоFROM Publisher,sponsor

WHERE Publisher.pnum = Sponsor.pnum AND sname != 'GAZPROM';

/

SELECT * FROM PublView;

Результат выполнения скрипта:

Пакет №2

В состав пакета включен вызов процедур из первого пакета, также размещены процедуры для добавления или удаления компании для заданного тарифа. Значения изменяемых данных передаются в процедуру как параметры. Также в пакет включена процедура для вывода компаний, у которых все тарифы менее заданной величины. Выборка данных производится в коллекцию, глобально определенную в пакете.

Скрипт pack2.sql

create or replace package pack2 is

TYPE EmpTab IS TABLE OF publisher.pname%type;

PROCEDURE FillTab;

PROCEDURE ClearTab;

PROCEDURE MinAndMaxPub;

PROCEDURE Run(emps IN EmpTab);

PROCEDURE addSponsor(pnum IN NUMBER, sname IN VARCHAR2);

end pack2;

CREATE OR REPLACE PACKAGE BODY pack2 is

PROCEDURE FillTab

AS

BEGIN

pack1.fill_tables;

END FillTab;

PROCEDURE ClearTab

AS

BEGIN

pack1.clear_tables;

END ClearTab;

PROCEDURE addSponsor

(pnum IN NUMBER, sname IN VARCHAR2)

AS

BEGIN

EXECUTE IMMEDIATE 'INSERT INTO Sponsor VALUES('||

TO_CHAR(spSeq.NEXTVAL)||','||TO_CHAR(pnum)||','''||

TO_CHAR(sname)||''')';

END addSponsor;

PROCEDURE MinAndMaxPub

AS

tmp EmpTab;

emps EmpTab;

minPubNum Number(4);

maxPubNum Number(4);

BEGIN

select pnum bulk collect INTO tmp from

(select count(snum) as cnt,pnum from sponsor group by pnum order by cnt);

maxPubNum := tmp(tmp.Last);

minPubNum := tmp(tmp.First);

SELECT pname bulk collect INTO emps FROM publisher

WHERE pnum=maxPubNum or pnum=minPubNum;

RUN(emps);

EXCEPTION

WHEN others THEN

DBMS_OUTPUT.put_line(SQLERRM);

END MinAndMaxPub ;

procedure run(emps IN EmpTab)

as

begin

if(emps.count = 0) then

DBMS_OUTPUT.PUT_LINE('Коллекция пуста');

else

DBMS_OUTPUT.PUT_LINE('Результаты:');

for i in emps.FIRST..emps.LAST

LOOP

DBMS_OUTPUT.PUT_LINE(i||') '||emps(i));

END LOOP;

END IF;

EXCEPTION

WHEN others THEN

DBMS_OUTPUT.put_line(SQLERRM);

end run;

end pack2;