МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Учреждение образования «БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ» Факультет Информационных технологий Кафедра Информационных систем и технологий Специальность 1-40 05 01 Информационные системы и технологии Направление специальности 1-40 01 02 03 Информационные системы и технологии (издательско-полиграфический комплекс) ПОЯСНИТЕЛЬНАЯ ЗАПИСКА КУРСОВОГО ПРОЕКТА: По дисциплине: «Администрирование баз данных и приложений» Тема: Реализация базы данных «железнодорожный вокзал» с использованием технологии шифрования и маскирования в БД Исполнитель Студент 3 курса группы 2 Дядюк В.А. (Ф.И.О.) Руководитель работы ассистент Копыток Д. В. (учен. степень, звание, должность, подпись, Ф.И.О.) Курсовой проект защищен с оценкой Председатель (подпись) Минск 2022г Копыток Д. В. 2 Оглавление Введение....................................................................................................................... 3 1 Постановка задачи ................................................................................................. 4 2 Разработка модели базы данных ......................................................................... 5 3 Разработка необходимых объектов ..................................................................... 6 4 Описание процедур импорта и экспорта ........................................................... 8 5 Тестирование производительности .................................................................... 9 6 Описание технологии и ее применения в базе данных ................................. 10 Заключение ............................................................................................................... 12 Cписок источников ................................................................................................. 13 Приложение А .......................................................................................................... 14 Приложение Б ........................................................................................................... 18 Приложение В ........................................................................................................... 20 3 Введение В современном мире всё завязано на информации. Очень часто нам приходится работать с различными данными, не важно, будь это телефонные номера, дела на день, фотографии в смартфоне или что-либо ещё. Если это компьютерная игра, то данными будут типы и местоположение врагов, их уровень здоровья, тип героя и так далее. Если приложение для работы с клиентом, то мы имеем дело с данными по типу имени клиента, его заказы, номер телефона и так далее. Для упрощения работы с этими данными были созданы базы данных – это набор данных, организованных каким-то способом. Например, если у вас в квартире есть гардеробная или кладовка, то всё это помещение со всем её содержимым может считаться базой (но не данных, а вещей или банок с огурцами, что не меняет сути) Базы данных очень упрощают доступ к данным и имеют основные задачи, такие как: cохранить наши данные по запросу, изменить наши данные по запросу, найти эти данные по запросу, не дать прочитать эти данные тем, кому не следует, а кому надо — дать. И так далее. На сегодняшний день на рынке представлено множество технологий доступа к данным и серверов баз данных, каждое, из которых имеет свои отличительные черты. Современные приложения обработки данных ориентированы на работу с большим количеством пользователей, на их удаленность от места расположения основного сервера БД. Темой данного курсового проекта является разработка программы «железнодорожный вокзал». Пользователь «Театр» имеет доступ к таблицам в базе данных и предназначен для взаимодействия с источником данных. Взаимодействие подразумевает получение данных, их представление в определенном формате для просмотра пользователем, редактирование в соответствии с реализованными в программе бизнес-алгоритмами и возврат обработанных данных обратно в базу данных. 4 1 Постановка задачи Целью данной курсовой работы является создание программного обеспечения для автоматизации процесса администрирования железнодорожной станции и продажи билетов. Задача проекта: совершенствование практических навыков в использовании и разработке современных информационных систем, разработка архитектуры приложения, Создание базы данных и интерфейса, выполнение тестирования готового продукта. Функционально должны быть выполнены следующие задачи: ˗ Отслеживание информации о локомотивах; ˗ регистрация новых пользователей в приложении; ˗ шифрование данных пользователя; ˗ поиск билетов по параметрам; ˗ анализ маршрутов. Должны быть выполнены следующие требования: доступ к данным должен осуществляться только через соответствующие процедуры; должен быть проведен импорт данных из XML файлов, экспорт данных в формат XML; необходимо протестировать производительность базы данных на таблице, содержащей не менее 100 000 строк, и внести изменения в структуру в случае необходимости. Необходимо проанализировать планы запросов к таблице; применить технологию базы данных согласно выбранной теме: подробно описать применяемые системные пакеты, утилиты или технологии; показать применение указанной технологии в базе данных. 5 2 Разработка модели базы данных Первым этапом курсовой работы будет создание логически взаимосвязанных таблиц. Чтобы составить визуальную взаимосвязанную структуры нашей базы данных, нам необходимо продумать, какая информация будет храниться в этих таблицах, после этого создать связи с помощью первичных и внешних ключей. Диаграмма базы данных, спроектированной в ходе разработки приложения представлена на рисунке 2.1. Рисунок 2.1 – Диаграмма базы данных База данных состоит из следующих таблиц: ˗ билеты; ˗ рейсы; ˗ расписание; ˗ маршруты; ˗ категории маршрутов; ˗ локомотивы; ˗ вокзал; ˗ техническое обслуживание; ˗ бригады; ˗ отделы; ˗ работники; ˗ категории работников. 6 3 Разработка необходимых объектов В ходе проектирования базы данных было создано 12 таблиц, связанных между собой внешними ключами. Таблица 3.1 – Столбцы таблицы Categories_of_workers Наименование Тип Описание ID_CATEGORY number идентификатор билета, первичный ключ TITLE char описание Таблица 3.2 – Столбцы таблицы Employees Наименование Тип Описание ID_EMPLOYEES number идентификатор места, первичный ключ AGE number возраст FULL_NAME char имя EXPERIENCE number стаж DEPARTMENT number отдел Таблица 3.3 – Столбцы таблицы Department Наименование Тип ID_DEPARTMENT number TITLE nvarchar2(50) Описание идентификатор название Таблица 3.4 – Столбцы таблицы Brigade Наименование Тип Описание ID_BRIGADE number идентификатор афиши, первичный ключ DEPARTMENT number отдел TITLE char назание Таблица 3.5 – Столбцы таблицы Locomotives Наименование Тип ID_LOCOMOTIVES number LOCOMOTIV_BRIGADE number BRIGADE_OF_TECHNICIANS number LOCOMOTIV_AGE number Описание идентификатор, первичный ключ Локомотивная бригада Бригада техников Возраст локомотива Таблица 3.6 – Столбцы таблицы TECHNICAL_INSPECTION Наименование Тип Описание ID_INSPECTION number идентификатор, первичный ключ LOCOMOTIV nvarchar2(50) Id локомотива Таблица 3.7 – Столбцы таблицы Station Наименование Тип ID_STATION number TITLE nvarchar2(50) Описание идентификатор, первичный ключ название 7 Таблица 3.8 – Столбцы таблицы Route_Categories Наименование Тип Описание ID_ROUTE_CATEGORIES number идентификатор, первичный ключ TITLE Nvarchar2(50) название Таблица 3.9 – Столбцы таблицы Routes Наименование Тип Описание ID_ROUTES number идентификатор, первичный ключ TITLE Nvarchar2(50) описание CATEGORI number категория DIRECTION Nvarchar2(50) идентификатор билета, внешний ключ для связи с таблицей «Ticket» Таблица 3.10 – Столбцы таблицы Timetable Наименование Тип Описание ID_TIMETABLE number идентификатор, первичный ключ DURATIONN Nvarchar2(50) продолжительность ROUTE number маршрут LOCOMOTIV number локомотив Таблица 3.11 – Столбцы таблицы Flights Наименование Тип ID_FLIGHTS number CONDITION Nvarchar2(50) TIMETABL number DATEE number Описание идентификатор, первичный ключ свойства расписания Дата Таблица 3.12 – Столбцы таблицы Tickets Наименование Тип ID_TICKET number NAME_OF_THE_PASSENGER Nvarchar2(50) gender Nvarchar2(50) FLIGHTS number Описание идентификатор, первичный ключ Никнейм пользователя гендер Номер рейса 8 4 Описание процедур импорта и экспорта XML — это формат данных, используемый для обмена данными в форме, которая может быть легко использована и распространена. Часто возникает необходимость импортировать и экспортировать XML-файлы в Oracle. В данном курсовом проекте используются пакеты DBMS_XMLPARSER и DBMS_XSLPROCESSOR для импорта XML, и DBMS_XMLDOM для экспорта данных в XML формат. Для работы с файлами так же использовался пакет DBMS_LOB. В данном курсовом проекте функции экспорта, импорта используются для таблицы Post. Пример создания процедуры экспорта можно посмотреть на рисунке 4.1. Рисунок 4.1 – Процедура экспорта в XML файл Для импорта данных использовались пакеты DBMS_XMLPARSER и DBMS_XSLPROCESSOR. 9 5 Тестирование производительности Для проверки производительности базы данных необходимо заполнить ее большим количеством различных данных и узнать время выполнения одного запроса. Все сгенерированные данные были добавлены в один файл, в сумме всех данных вышло 100 000 строк на одну таблицу. Для тестирования была взята таблица Department, приведенная на рисунке 5.1. Рисунок 5.1 – Проверка количества строк в таблице Как видно на рисунке, изначально не был создан индекс и поэтому скорость работы получилась 0,016. Но, если мы создадим индекс, то получим следующий результат, представленный на рисунке 5.2. Рисунок 5.2 – Скорость работы без индекса Как было замечено, скорость работы увеличилась в несколько раз. 10 6 Описание технологии и ее применения в базе данных В процессе разработки проекта была разработана технология: шифрование и маскирование. Для шифрования использовался пакет DBMS_CRYPTO. Пакет DBMS_CRYPTO появился в Oracle10g. В более ранних версиях пакет DBMS_OBFUSCATION_TOOLKIT предоставлял похожую (но не идентичную) функциональность. Старый пакет все еще остается доступным, но сейчас он считается устаревшим, и вместо него рекомендуется использовать новый пакет. Вспомните, что для выполнения шифрования кроме входных данных необходимы еще четыре компонента: ˗ Ключ шифрования ˗ Алгоритм шифрования ˗ Метод заполнения ˗ Метод сцепления Ключ шифрования предоставляет пользователь, а остальные компоненты предоставляет Oracle. Выбор осуществляется при помощи соответствующих констант пакета DBMS_CRYPTO. Для реализации шифрования данных в базе данных была реализована функция DESEncrypt. Листинг данной функции представлен на листинге 6.1. CREATE OR REPLACE FUNCTION DESEncrypt(Data CLOB) RETURN RAW DETERMINISTIC IS EncryptionType PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; EncryptionKey RAW(256) := UTL_RAW.CAST_TO_RAW('AAAAC3NzaC1lZDI1NTE5AAAAILn2AbJgiqCZgSdQ 9w/f71M1YXcEffd3962cPzsj2nL7'); BEGIN RETURN DBMS_CRYPTO.ENCRYPT( SRC => UTL_RAW.CAST_TO_RAW(Data), TYP => EncryptionType, KEY => EncryptionKey 11 ); END; Листинг 6.1 – Функция шифрования данных Для дешифрования данных в базе данных была реализована функция DESDecrypt. Листинг данной функции представлен на листинге 6.2. CREATE OR REPLACE FUNCTION DESDecrypt(Data RAW) RETURN CLOB DETERMINISTIC IS EncryptionType PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; EncryptionKey RAW (256) := UTL_RAW.CAST_TO_RAW('AAAAC3NzaC1lZDI1NTE5AAAAILn2AbJgiqCZgSdQ 9w/f71M1YXcEffd3962cPzsj2nL7'); BEGIN RETURN UTL_RAW.CAST_TO_VARCHAR2(DBMS_CRYPTO.Decrypt( SRC => Data, TYP => EncryptionType, KEY => EncryptionKey )); END; Листинг 6.2 – Функция дешифрования данных 12 Заключение В процессе решения задачи была достигнута поставленная нами цель по созданию базы данных для автоматизированной системы «железнодорожная станция». При разработке курсового проекта использовались объекты: таблицы, хранимые процедуры, индексы, последовательности, пакеты. Основной целью курсового проекта стало проектирование базы данных для дальнейшей интеграции с приложением, которое поможет облегчить взаимодействие с базой данных посредством программного интерфейса. Взаимодействие между приложением и базой данных будет реализовано с помощью технологии ADO.NET. При разработке выполнены следующие пункты: ˗ разработка приложения для взаимодействия с БД; ˗ возможность заказать билет; ˗ возможность поиска билета; ˗ возможность регистрации новых пользователей; ˗ шифрование данных пользователя; ˗ отправка билета по почте. БД прошло тестирование при использовании большого количество данных. Также были реализованы процедуры для импорта, экспорта данных в формат XML. Была реализована технология «Шифрование и маскирование». Шифрование данных было реализовано с помощью пакета DBMS_CRYPTO. В соответствии с полученным результатом работы программы можно сделать вывод, что разработанная программа работает верно, а требования технического задания выполнены в полном объёме. 13 Cписок источников 1 Язык C# и .NET Framework [Электронный ресурс] – http://professorweb.ru/my/csharp/charp_theory/level1/infonet.php. 2 Руководство по ADO.NET и работе с базами данных [Электронный ресурс] – https://metanit.com/sharp/adonet/. 3 Документация Oracle [Электронный ресурс] / Foundation, Inc. https://docs.oracle.com/cd/B28359_01/server.111/b31222/toc.htm 4 Официальный сайт Oracle [Электронный ресурс] / Foundation, Inc. https://www.oracle.com/database/database-vault/index.html 5 Продукты Oracle [Электронный ресурс] [Электронный ресурс] / Foundation, Inc. http://www.interface.ru/home.asp?artId=24678 6 Документы Oracle [Электронный ресурс] / Foundation, Inc. http://www.oracle.com/technetwork/database/security/database-vault-ds-12c1898877.pdf 14 Приложение А //Создание таблиц create table Categories_of_workers ( ID_CATEGORY integer generated always as identity, TITLE varchar(100), primary key (ID_CATEGORY) ); create table Employees ( ID_EMPLOYEES integer generated always as identity primary key, FULL_NAME varchar(100), AGE NUMBER, GENDER varchar(3), EXPERIENCE NUMBER, DEPARTMENT INTEGER, BRIGADE INTEGER, SALARY INTEGER, CATEGORIES INTEGER, FOREIGN KEY (DEPARTMENT) REFERENCES Department(ID_DEPARTMENT), FOREIGN KEY (BRIGADE) REFERENCES Brigade(ID_BRIGADE), FOREIGN KEY (CATEGORIES) REFERENCES Categories_of_workers(ID_CATEGORY) ); create table Department ( ID_DEPARTMENT integer generated always as identity primary key, TITLE varchar(100) ); create table Brigade ( ID_BRIGADE integer generated always as identity primary key, DEPARTMENT integer, TITLE varchar(100), FOREIGN KEY (DEPARTMENT) REFERENCES Department(ID_DEPARTMENT) ); 15 create table Locomotives ( ID_LOCOMOTIVES integer generated always as identity primary key, LOCOMOTIV_BRIGADE integer, BRIGADE_OF_TECHNICIANS integer, LOCOMOTIV_AGE number, SNAP_STATION integer, FOREIGN KEY (LOCOMOTIV_BRIGADE) REFERENCES Brigade(ID_BRIGADE), FOREIGN KEY (BRIGADE_OF_TECHNICIANS) REFERENCES Brigade(ID_BRIGADE), FOREIGN KEY (SNAP_STATION) REFERENCES Station(ID_STATION) ); create table TECHNICAL_INSPECTION ( ID_INSPECTION integer generated always as identity primary key, LOCOMOTIV integer, DATE_START date, DATE_FINISH date, FOREIGN KEY (LOCOMOTIV) REFERENCES Locomotives(ID_LOCOMOTIVES) ); create table Station ( ID_STATION integer generated always as identity primary key, TITLE varchar(100) ); create table Route_Categories ( ID_ROUTE_CATEGORIES integer generated always as identity primary key, TITLE varchar(100) ); create table Routes ( ID_ROUTES integer generated always as identity primary key, TITLE varchar(100), CATEGORI integer, DIRECTION varchar(100), 16 FOREIGN KEY (CATEGORI) REFERENCES Route_Categories(ID_ROUTE_CATEGORIES) ); create table Timetable ( ID_TIMETABLE integer generated always as identity primary key, ROUTE integer, DURATIONN varchar(10), LOCOMOTIV integer, SCHEDULED_DEPARTURE varchar(10), SCHEDULED_ARRIVAL varchar(10), COSTT number, FOREIGN KEY (LOCOMOTIV) REFERENCES Locomotives(ID_LOCOMOTIVES), FOREIGN KEY (ROUTE) REFERENCES Routes(ID_ROUTES) ); create table Flights ( ID_FLIGHTS integer generated always as identity primary key, TIMETABL integer, DATEE date, ACTUAL_DEPARTURE date, ACTUAL_ARRIVAL date, CONDITION varchar(100), NUMBER_OF_TICKETS integer, UNREDUCED_TICKETS integer, NUMBER_OF_TICKETS_GIVEN integer, ARRIVAL_STATION integer, DEPARTURE_STATION integer, FOREIGN KEY (TIMETABL) REFERENCES Timetable(ID_TIMETABLE), FOREIGN KEY (ARRIVAL_STATION) REFERENCES Station(ID_STATION), FOREIGN KEY (DEPARTURE_STATION) REFERENCES Station(ID_STATION) ); alter table Flights modify ACTUAL_ARRIVAL date create table Tickets ( 17 ID_TICKET integer generated always as identity primary key, DATE_OF_SALE varchar(100), FLIGHTS integer, CARRIAGE integer, PLACE integer, NAME_OF_THE_PASSENGER varchar(100), AGE integer, gender varchar(10), FOREIGN KEY (FLIGHTS) REFERENCES Flights(ID_FLIGHTS) ); 18 Приложение Б --Export/Import XML Create or replace Directory EXPORTFILE AS 'C:\\xml'; declare xml_clob clob; begin select dbms_xmlgen.getxml('select * from locomotives') into xml_clob from dual; DBMS_XSLPROCESSOR.CLOB2FILE(cl => xml_clob, flocation => 'EXPORTFILE', fname => 'locomotives.xml'); end; declare xml_clob clob; begin select dbms_xmlgen.getxml('select * from routes') into xml_clob from dual; DBMS_XSLPROCESSOR.CLOB2FILE(cl => xml_clob, flocation => 'EXPORTFILE', fname => 'routes.xml'); end; declare xml_clob clob; begin select dbms_xmlgen.getxml('select * from station') into xml_clob from dual; DBMS_XSLPROCESSOR.CLOB2FILE(cl => xml_clob, flocation => 'EXPORTFILE', fname => 'station.xml'); end; declare xml_clob clob; begin select dbms_xmlgen.getxml('select * from timetable') into xml_clob from dual; DBMS_XSLPROCESSOR.CLOB2FILE(cl => xml_clob, flocation => 'EXPORTFILE', fname => 'timetable.xml'); end; declare xml_clob clob; begin select dbms_xmlgen.getxml('select * from Pasangers') into xml_clob from dual; DBMS_XSLPROCESSOR.CLOB2FILE(cl => xml_clob, flocation => 'EXPORTFILE', fname => 'Pasangers.xml'); 19 end; --------------------------------------------------------------------import INSERT INTO Pasangers SELECT x.* FROM (SELECT XMLTYPE(bfilename('EXPORTFILE', nls_charset_id('UTF8')) xml_data FROM dual), XMLTABLE('/ROWSET/ROW' PASSING xml_data columns ID_PAS integer path 'ID_PAS', First_Name varchar(100) path 'First_Name') x; select * from Pasangers; 'Pasangers.xml'), 20 Приложение В CREATE OR REPLACE FUNCTION DESEncrypt(Data CLOB) RETURN RAW DETERMINISTIC IS EncryptionType PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; EncryptionKey RAW(256) := UTL_RAW.CAST_TO_RAW('AAAAC3NzaC1lZDI1NTE5AAAAILn2AbJgiqCZgSdQ9w/f71M1Y XcEffd3962cPzsj2nL7'); BEGIN RETURN DBMS_CRYPTO.ENCRYPT( SRC => UTL_RAW.CAST_TO_RAW(Data), TYP => EncryptionType, KEY => EncryptionKey ); END; SELECT DESEncrypt('DATA') FROM DUAL; ---1 create or replace procedure select_train_driver(p_categ employees.categories%type) is fname varchar(100); cou number; cursor get_names is select full_name from employees where categories = p_categ; begin open get_names; loop exit when get_names%NOTFOUND; fetch get_names into fname; DBMS_OUTPUT.put_line(fname); end loop; close get_names; select count(full_name) categories = p_categ; DBMS_OUTPUT.put_line(cou); commit; end; declare begin select_train_driver(22); end; into cou from employees in where 21 select * from employees ---2 create or replace procedure select_empl_in_brigade(p_brigade in employees.brigade%type) is fname varchar(100); cou number; cursor get_names is select full_name from employees where brigade = p_brigade; begin open get_names; loop exit when get_names%NOTFOUND; fetch get_names into fname; DBMS_OUTPUT.put_line(fname); end loop; close get_names; select count(full_name) brigade = p_brigade; into cou from employees where DBMS_OUTPUT.put_line('count : '||cou); commit; end; declare begin select_empl_in_brigade(1); end; ---3 create or replace procedure loc_with_st(p_time in flights.ACTUAL_ARRIVAL%type, p_station in station.id_station%type) is loc integer; cursor get_loc is select id_locomotives from locomotives inner join timetable on locomotiv = locomotives.id_locomotives inner join flights on flights.timetabl = timetable.id_timetable and locomotives.snap_station=p_station and ((arrival_station=p_station and trunc(p_time,'HH24')>trunc(flights.ACTUAL_ARRIVAL,'HH24')) or (departure_station=p_station and trunc(p_time,'HH24')<trunc(flights.ACTUAL_DEPARTURE,'HH24'))) group by id_locomotives; begin open get_loc; loop exit when get_loc%NOTFOUND; 22 fetch get_loc into loc; DBMS_OUTPUT.put_line(loc); end loop; close get_loc; commit; end; declare begin loc_with_st(to_date('11/12/2002 HH24:MI:SS'), 1); end; 21:00:00','MM/DD/YYYY select * from timetable; select * from locomotives; select * from flights; --4 create or replace procedure technical_insp(p_time in technical_inspection.date_start%type) is fname varchar(100); cursor get_loc is select locomotiv from technical_inspection where p_time>technical_inspection.date_start and p_time<technical_inspection.date_finish; begin open get_loc; loop exit when get_loc%NOTFOUND; fetch get_loc into fname; DBMS_OUTPUT.put_line(fname); end loop; close get_loc; end; declare begin technical_insp(to_date('11/12/2002 HH24:MI:SS')); end; 19:00:00','MM/DD/YYYY --5 create or replace procedure inf_from_timetable(p_time_from in technical_inspection.date_start%type,p_time_to in technical_inspection.date_start%type) is fname varchar(100); cursor get_loc is select locomotiv from timetable inner join flights on timetable.id_timetable = flights.timetabl and trunc(p_time_from,'HH24')>trunc(flights.ACTUAL_DEPARTURE,'HH24') 23 and trunc(p_time_to,'HH24')<trunc(flights.ACTUAL_ARRIVAL,'HH24'); begin open get_loc; loop exit when get_loc%NOTFOUND; fetch get_loc into fname; DBMS_OUTPUT.put_line(fname); end loop; close get_loc; end; declare begin inf_from_timetable(to_date('11/12/2002 13:00:00','MM/DD/YYYY HH24:MI:SS'),to_date('11/12/2002 14:00:00','MM/DD/YYYY HH24:MI:SS')); end; --6 create or replace procedure inf_from_timetable(p_cost_min in timetable.costt%type, p_cost_max in timetable.costt%type) is fname varchar(100); cursor get_loc is select locomotiv from timetable where costt>p_cost_min and costt<p_cost_max; begin open get_loc; loop exit when get_loc%NOTFOUND; fetch get_loc into fname; DBMS_OUTPUT.put_line(fname); end loop; close get_loc; end; declare begin inf_from_timetable(100,150); end; --7 create or replace procedure inf_from_timetable(p_cost_min in timetable.costt%type, p_cost_max in timetable.costt%type) is fname varchar(100); cursor get_loc is select locomotiv from timetable where costt>p_cost_min and costt<p_cost_max; begin open get_loc; loop exit when get_loc%NOTFOUND; fetch get_loc into fname; 24 DBMS_OUTPUT.put_line(fname); end loop; close get_loc; end; declare begin inf_from_timetable(100,150); end; --8 create or replace procedure inf_from_flights(p_status flights.condition%type) is fname varchar(100); cursor get_flight is select id_flights from flights where p_status=condition; begin open get_flight; loop exit when get_flight%NOTFOUND; fetch get_flight into fname; DBMS_OUTPUT.put_line(fname); end loop; close get_flight; end; in declare begin inf_from_flights('test'); end; --9 create or replace procedure inf_from_flights(p_id in flights.ID_FLIGHTS%type) is allTic varchar(100); unreduced varchar(100); given varchar(100); begin select NUMBER_OF_TICKETS, UNREDUCED_TICKETS, NUMBER_OF_TICKETS_GIVEN into allTic, unreduced, given from flights where id_flights = p_id; DBMS_OUTPUT.put_line('All : '||alltic); DBMS_OUTPUT.put_line('Unredused : '||unreduced); DBMS_OUTPUT.put_line('Given : '||given); end; declare begin inf_from_flights(21); end; 25 --10 create or replace procedure select_pasanger(p_id in tickets.flights%type, p_age in tickets.age%type, p_gender in tickets.gender%type) is fname varchar(100); cou number; cursor get_names is select NAME_OF_THE_PASSENGER from tickets where flights=p_id and age=p_age and gender=p_gender; begin open get_names; loop exit when get_names%NOTFOUND; fetch get_names into fname; DBMS_OUTPUT.put_line(fname); end loop; close get_names; select count(NAME_OF_THE_PASSENGER) into cou from tickets where flights=p_id and age=p_age and gender=p_gender; DBMS_OUTPUT.put_line('count : '||cou); commit; end; declare begin select_pasanger(1,10,'m'); end;