- •Курсовая работа
- •Содержание
- •Постановка задачи
- •Структура данных
- •3. Скрипт создания таблиц (create_tables.Sql)
- •3.1 Скрипт create_table.Sql
- •4. Скрипт pack1
- •Выводы о проделанной работе
- •Литература
- •Приложение a. Листинги файлов
- •Описание процедур и функций
- •6. Предоставление привилегий (grants.Sql)
Описание процедур и функций
PROCEDURE changekey(num IN NUMBER, newkey IN NUMBER - Процедура должна изменять первичный ключ рейса. В процедуру передается номер рейса, по которому необходимо искать, и новый первичный ключ.
FUNCTION maxplane(fly IN NUMBER) RETURN NUMBER - функция , которая возвращает самолет с максимальной вместимостью для рейса, переданного как параметр.
PROCEDURE eachplane - процедура , которая выводит на экран для каждого рейса самолет,возвращаемый функцией..
6. Предоставление привилегий (grants.Sql)
Согласно заданию, требуется выдать право на использование представления всем пользователям; на использование процедуры changekey – только конкретному пользователю.
Однако процедура changekey находится внутри пакета Pack_2, и нет возможности выдать право на ее запуск (можно лишь выдать привилегии на использование всего пакета, что недопустимо), а, следовательно, потребуется создать самостоятельную процедуру-обертку, которая будет запускать процедуру changekey из пакета. На запуск этой процедуры предоставим привилегии пользователю SYSTEM.
Выводы о проделанной работе
В процессе разработки скриптов, необходимых для выполнения задания курсовой работы, были разработаны две таблицы: airplanes и flights, необходимые для хранения информации предметной области. При этом были учтены связи между таблицами. Также были разработаны пакеты, содержащие процедуры обработки данных; триггер, контролирующий время выхода фильма; и представление view, позволяющее пользователям БД просматривать информацию из связанных таблиц в формализованном и удобочитаемом виде.
В ходе выполнения данной курсовой работы я закрепила и улучшил навыки работы с СУДБ Oracle, полученные при выполнении лабораторных работ.
Литература
Лекции по курсу «Сетевые базы данных»
Oracle PL/SQL для профессионалов 3-е изд. / С. Фейерштейн, Б. Прибыл, - СПб.:Питер, 2004. – 941 с.
Краткий справочник по Oracle7. http://www.codenet.ru/db/oracle/ora1/
Oracle Database SQL Reference 10g Release 2 (10.2). http://docs.oracle.com/cd/B19306_01/server.102/b14200/index.htm
Приложение a. Листинги файлов
paсk2.sql
CREATE OR REPLACE PACKAGE pack2 IS
PROCEDURE changekey(num IN NUMBER, newkey IN NUMBER);
FUNCTION maxplane(fly IN NUMBER) RETURN NUMBER;
PROCEDURE eachplane;
END pack2;
/
CREATE OR REPLACE PACKAGE BODY pack2 IS
PROCEDURE changekey(num IN NUMBER, newkey IN NUMBER) IS
fnumber NUMBER;
abc NUMBER;
found_err EXCEPTION;
BEGIN
UPDATE flights SET fid = newkey WHERE fnum = num;
IF SQL%NOTFOUND THEN raise found_err; END IF;
DBMS_OUTPUT.PUT_LINE('New primary key for fligth #' || num || ' is ' || newkey);
COMMIT;
EXCEPTION
WHEN found_err THEN
DBMS_OUTPUT.PUT_LINE('Flight not found.');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Error: No Data Found.');
END;
FUNCTION maxplane(fly IN NUMBER) RETURN NUMBER IS
ret NUMBER(4);
found_err2 EXCEPTION;
BEGIN
SELECT MAX(acapacity) INTO ret FROM airplanes
WHERE airplanes.f_id = fly;
IF SQL%NOTFOUND THEN raise found_err2; END IF;
RETURN ret;
EXCEPTION
WHEN found_err2 THEN
DBMS_OUTPUT.PUT_LINE('Flight not found.');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Error: No Data Found.');
END;
PROCEDURE eachplane IS
plane NUMBER;
num NUMBER;
retnum NUMBER;
CURSOR curf IS
SELECT fid, fnum from flights;
BEGIN
OPEN curf;
LOOP
FETCH curf INTO plane, num;
EXIT WHEN curf%NOTFOUND;
retnum := pack2.maxplane(plane);
IF (retnum > 0) THEN
dbms_output.put_line('For fligth #' || num || ' airplane -> ' || retnum);
ELSE
dbms_output.put_line('Not found airplane for fligth #' || num);
END IF;
END LOOP;
CLOSE curf;
END;
END pack2;
/
BEGIN
pack1.clear_tables;
pack1.fill_tables;
pack2.eachplane;
pack2.changekey(201,11);
END;
/
my_trigg.sql
CREATE OR REPLACE TRIGGER my_trigger
AFTER UPDATE of fid ON flights
DECLARE
nameu VARCHAR2(50);
BEGIN
dbms_output.put_line('We here.');
nameu := USER;
IF (nameu <> 'SYSTEM') THEN
INSERT INTO for_trigger VALUES(seq.nextval, nameu, TO_DATE(SYSDATE,'DD.MM.YYYY'));
END IF;
END;
my_view.sql
CREATE OR REPLACE VIEW my_view AS
SELECT airplanes.avialines, airplanes.acapacity AS airplanes, flights.fname, flights.fdata AS flights FROM flights, airplanes
WHERE flights.fid = airplanes.f_id;
SELECT * FROM my_view;
GRANT SELECT ON my_view TO PUBLIC;
grant.sql
CREATE OR REPLACE PROCEDURE changekey(num IN NUMBER, newkey IN NUMBER)
IS
BEGIN
pack2.changekey(num, newkey);
END changekey;
/
GRANT EXECUTE ON changekey TO SYSTEM;
