
Создание триггера
Триггер должен регистрировать ввод, указывая идентификатор спонсора, пользователя и время ввода.
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;