Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИТиУвТС / ИОСУ Вариант14 СУБД Oracle / Контрольная работа.docx
Скачиваний:
67
Добавлен:
01.04.2014
Размер:
10.67 Mб
Скачать

Практическая часть

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

CREATE TABLE ofice(

dateID date NOT NULL,

First_department INTEGER,

Second_department INTEGER,

Third_department INTEGER, PRIMARY KEY(dateID));

INSERT INTO ofice VALUES('1/10/10', 3,1,5);

INSERT INTO ofice VALUES('2/10/10', 10,4,3);

INSERT INTO ofice VALUES('3/10/10',5,4,4);

INSERT INTO ofice VALUES('4/10/10', 7,9,1);

INSERT INTO ofice VALUES ('5/10/10', 6,4,3);

select* from ofice;

CREATE OR REPLACE PROCEDURE client2 is

first_dep NUMBER ;

s_dep NUMBER;

third_dep NUMBER;

BEGIN

select sum(first_department) into first_dep from ofice;

select sum(second_department) into s_dep from ofice;

select sum(third_department) into third_dep from ofice;

dbms_output.put_line('First_department'||' '||first_dep);

dbms_output. put_line(' Seconddepartment'||' '|| s_dep); dbms_output.put_line('Third_department'||' '||third_dep);

END;

set serveroutput on;

execute client2;

Задание:

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

CREATE TABLE otdel(

imia_otdela varchar2(30),

kolvo integer,

primary key(imia_otdela));

INSERT INTO otdel VALUES('otdel_prodaj', 13);

INSERT INTO otdel VALUES('otdel_razrabotki', 21);

INSERT INTO otdel VALUES('otk',23);

CREATE OR REPLACE FUNCTION prcnt(name in varchar2) RETURN float IS

rab_count INTEGER; summa INTEGER; BEGIN

SELECT sum(kolvo) INTO summa FROM otdel;

SELECT kolvo INTO rab_count FROM otdel WHERE (imia_otdela=name);

RETURN (rab_count/summa);

END;

CREATE OR REPLACE PROCEDURE simple_stat IS

begin

dbms_output.put_line('otdel1'||' - '||TO_CHAR(prcnt('otdel_prodaj')*100, '$99.0')||'%');

dbms_output.put_line('otdel2'||' - '||TO_CHAR(prcnt('otdel_razrabotki')*100, '$99.0')||'%');

dbms_output.put_line('otdel3'||' - '||TO_CHAR(prcnt('otk')*100, - '||$99.0')|| '%');

end;

/

set serveroutput on;

execute simple_stat;

Вывод: Были изучены возможности и основные программные конструкции язык PL/SQL. Получены навыки разработки хранимых процедур и функций баз данных ORACLE.

Задание № 4 Триггеры баз данных

Цель работы – изучить предназначение и особенности создания триггеров баз данных по сравнению с хранимыми процедурами и функциями.

Теоретическая часть

Триггер — это процедура PL/SQL, которая выполняется автоматически, когда происходит некоторое заданное событие, называемое триггерным событием (triggering event). Например, можно писать триггеры, срабатывающие при выполнении над таблицей операций INSERT, UPDATE или DELETE; при выдаче команд DDL; при входе пользователя в систему или его выходе из системы; при запуске или останове базы данных; при возникновении ошибок.

Между триггерами и процедурами PL/SQL есть три различия:

• Триггеры нельзя вызывать из кода программы. Oracle вызывает их

автоматически в ответ на определенное событие.

• Триггеры не имеют списка параметров.

• Спецификация триггера немного отличается от спецификации процедуры.

Триггер лучше всего описать как процедуру, которая автоматически выполняется при возникновении некоторого события, указанного в определении триггера, — триггерного события (triggering event).

Сходство между триггерами и процедурами состоит в следующем:

• Тело триггера выглядит точно так же, как и тело процедуры .

• Триггер не возвращает никаких значений.

• Триггеры можно использовать для выполнения разнообразных задач.

• Триггеры автоматически генерируют производные значения столбцов.

• Триггеры помогают предотвращать неверные транзакции.

• Триггеры можно использовать для реализации сложных процедур

авторизации.

• Триггеры используются для реализации сложных бизнес-правил.

• Триггеры могут обеспечивать прозрачное протоколирование событий.

• Триггеры могут обеспечивать сложный аудит.

• Триггеры могут собирать статистику доступа к таблицам.

Типы триггеров

Момент срабатывания определяет, когда будет срабатывать триггер: до (BEFORE) или после (AFTER) наступления триггерного события (выполнения запускающего оператора). Если указано значение BEFORE, триггер выполняется до каких-либо проверок ограничений на строки, затрагиваемые триггерным событием. Никакие строки не блокируются. Триггер этого типа называется, соответственно, BEFORE-триггером (BEFORE trigger). Если выбрать ключевое слово AFTER, то триггер будет срабатывать после того, как запускающий оператор завершит свою работу.и будут выполнены проверки всех ограничений. В этом случае затрагиваемые строки блокируются на время выполнения триггера. Триггер этого типа называется AFTER-триггером (AFTER trigger).

Триггерное событие может принимать значения INSERT, UPDATE или DELETE.

Триггерное ограничение — это одно и более дополнительных условий, которые должны быть выполнены для срабатывания триггера.

Необязательный набор ключевых слов FOR EACH ROW указывает на необходимость выполнить тело триггера для каждой строки, затрагиваемой запускающим оператором. Такие триггеры называются строчными (row triggers). Если опция FOR EACH ROW отсутствует, то при наступлении триггерного события триггер выполняется только один раз. В этом случае он называется операторным триггером (statement trigger), поскольку выполняется только один раз для каждого запускающего оператора.

Часть кода между DECLARE и END имя триггера представляет собой обычный базовый блок PL/SQL.

Различные триггерные события можно комбинировать с помощью оператора OR. Например: DELETE OR INSERT остальные_операторы.

В случае использования UPDATE можно указать список столбцов:

UPDATE ОРстолбец_1, столбец_2,...

При использовании UPDATE в операторах PL/SQL обращение к новой и старой строкам выполняется с помощью слов "new" и "old", предваренных двоеточием.

Вне зависимости от типа триггера все триггеры создаются одинаково. Общий синтаксис создания таков:

сreate [or replace] trigger имя_триггера

{before | after | instead of} активизирующее_событие

on имя_таблицы

[for each row]

тело_триггера

Здесь активизирующее_событие указывает событие активации триггера (далее указывается конкретная таблица или представление).

Соседние файлы в папке ИОСУ Вариант14 СУБД Oracle