You are on page 1of 17

ЛАБОРАТОРНА РОБОТА 5

СТВОРЕННЯ ПРОЦЕДУР, ЩО ЗБЕРІГАЮТЬСЯ, ДЛЯ ЗМІНИ АБО


ЗБЕРЕЖЕННЯ ДАНИХ

5.1 МЕТА РОБОТИ


Вивчення засобів застосування SQL у реальних умовах.

5.2 ТЕОРЕТИЧНІ ВІДОМОСТІ


Процедура, яка зберігається (ПЗ), – це откомпільований набір операторів
SQL, що також зветься функцією або підпрограмою, створений програмістом
для зручності використання (збережену процедуру використовувати простіше,
ніж кожен раз записувати увесь набір операторів SQL, що в неї входять). Крім
того, ПЗ можливо вкладати одну в одну – організувати послідовність програм.
Існують два вида ПЗ, це ПЗ вибору і ПЗ, що виконуються. Додатки мають
можливість використовувати ПЗ вибору замість таблиць або уявлень в
інструкції SELECT. ПЗ вибору повина бути визначена для повернення одного
або більше значень, інакше результатом виконання процедури буде помилка.
Виконання такої ПЗ можливо потребує деяких параметрів. Інакше, цей різновид
ПЗ зветься функцією, яка зберігається, (ФЗ) – таке позначення будемо
використовувати у подальшому.
ПЗ, що виконується (у подальшому – також ПЗ), не повертає значень
програмі, що її викликала. Додатки мають можливість викликати ПЗ в
інструкції EXECUTE PROCEDURE.
ПЗ має заголовок і тіло. Заголовок ПЗ містить:
- унікальне ім’я серед процедур і таблиць;
- необов’язковий список вхідних параметрів і їх типів даних, які
процедура приймає з програми, яка її викликала;
- за ключовим словом RETURNS список вихідних параметрів і їх
типів даних, якщо процедура повертає значення у програму, яка її
викликала.

1
Тіло процедури має:
- необов’язковий список локальних змінних і їх типів даних;
- блок інструкцій на мові процедур і тригерів InterBase, обмежений
BEGIN і END.
Мова процедур і тригерів InterBase містить оператори SQL, оператори IF…
THEN…ELSE, WHILE…DO, FOR SELECT…DO, виняткові ситуації і обробку
помилок.
Кожна інструкція завершується крапкою з комою, тому необхідно
визначити інший символ для завершення інструкції CREATE PROCEDURE.
Потрібно використати SET TERM поперед CREATE PROCEDURE, для того
щоб визначити термінатор, який відрізняється від крапки з комою. Після
інструкції CREATE PROCEDURE вставляють SET TERM для зміни
термінатору назад.

Мова процедур і тригерів InterBase – це повна мова програмування для ПЗ


і тригерів. Вона включає:

 інструкції SQL маніпулювання даними: INSERT, UPDATE, DELETE і


singleton SELECT;
 оператори і вирази SQL, включаючи генератори;
 включає інструкції присвоєння, контекстні змінні (для тригерів),
виключні ситуації та інструкції обробки помилок.

Наступна таблиця сумує розширення мови для ПЗ:

Інструкція Опис

BEGIN ... END Визначає блок інструкцій, котрі виконуються як


одне. Ключове слово BEGIN починає блок; ключове
слово END завершує блок. Не повинен
супроводжуватися крапкою з зап’ятою.
variable = expression Інструкція присвоєння, котра присвоює

2
значення виразу змвнної, локальної змінної,
вхідному параметру чи вихідному параметру.
/* comment_text */ Коментарій до програми, де comment_text може
бути текстом, який містить будь-яку кількість
рядків.
EXCEPTION Піднімає іменовану виключну ситуацію.
exception_name Виключна ситуація – визначенна користувачем
помилка, котра може бути оброблена інструкцією
WHEN.
EXECUTE PROCEDURE Виконує ПЗ proc_name із вхідними
proc_name [var [,var ...]]аргументами, які йдуть за іменем процедури, які
[RETUNING_VALUES varповертаються значеннями вихідних аргументів,
[,var ...]] перерахованими слід за RETURNING_VALUES.
EXIT Переходи до завершуючих інструкцій END в
ПЗ.
FOR <select_statement> Повторення інструкції чи блоку, котрий йде за
DO <compound_statement> DO, для кожного допустимого рядка
<select_statement>.
 <select_statement>: нормальна інструкція
SELECT, за виключенням того, що INTO речення
виманає і повинно бути останніми.

 <compound_statement>: чи одинична
інструкція на мові процедур і тригерів чи блок
інструкцій, який є в BEGIN і END.
IF (<condition>)  Перевіряє <condition> і, якщо умова TRUE,

THEN виконує інструкцію чи блок, який йде за THEN;


<compound_statement> інакше, виконує інструкцію чи блок який йде за
[ELSE ELSE, якщо він існує. Тут <condition> - булевий
<compound_statement>] вираз (TRUE, FALSE чи UNKNOWN); в основному,
це два вирази, які використовуються як операнди
оператору порівняння.
POST event_name Відправляє повідомлення event_name.
3
SUSPEND В процедурі вибору SUSPEND повертає вихідне
значення. Не рекомендується для виконуємих
процедур.
WHILE (<condition>) Доки <condition> TRUE, виконується
DO <compound_statement>. Перша <condition>
<compound_statement> перевіряється і, якщо вона TRUE, виконується
<compound_statement>. Ця послідовність
повторюється доки <condition> не перестане бути
TRUE.
WHEN {<error>[, Інструкція обробки помилок. Коли відбувається
<error>...]|ANY} DOодна з визначенних помилок, виконується
<compound_statement> <compound_statement>. Інструкція WHEN, якщо
<error> = {EXEPTIONприсутня, повинна знаходитися у кінці блоку,
exeption_name | SQLCODEбезпосередньо перед END.
errcode | GDSCODE number}  <error>: помилка визначеного виду;

 ANY: оброблюються всі типи помилок.

Процедура створюється командою CREATE PROCEDURE із синтаксисом:


CREATE PROCEDURE name
[(param <datatype> [, param <datatype> ...])]
[RETURNS <datatype> [, param <datatype> ...])]
AS <procedure_body> [terminator]
BEGIN
<compound_statement>
[<compound_statement> ...]
END
Де використовуються наступні позначення:
name – ім’я процедури, унікальне серед процедур, таблиць і уявлень;
param <datatype> - вхідний параметр, котрий викликаючи програма
використовує, щоб передати значення процедурі;

4
param - ім’я вхідного параметру, унікальне для змінних всередині
процедури;
<datatype> - будь-який тип даних InterBase;
RETURNS param <datatype> - вихідний параметр, котрий процедура
використовує, щоб вернути значення у викликаючи програму.
Процедура повертає значення вихідних параметрів, коли досягає інструкції
SUSPEND в тілі процедури.
AS - ключове слово, котре розділяє заголовок процедури і тіло процедури.
DECLARE VARIABLE var <datatype> - об’являє локальні змінні, які
використовуються тільки у процедурі. Кожному об’явленню повинно
передувати DECLARE VARIABLE із крапкою з зап’ятою (;);
Statement – будь-яка одинична інструкція в мові процедур і тригерів
InterBase. Кожна інструкція (виключаючи BEGIN і END) повинні
завершуватися точкою з зап’ятою (;).
Terminator – термінатор, визначений SET TERM, котрий вказує на
завершення тіла процедури. Використовується тільки в ISQL.

Розглянемо приклад: процедура SUB_TOT_BUGET бере номер відділу в


якості вхідного параметру і повертає суму бюджетів, середній, мінімальний і
максимальний бюджет департаментів із визначеним HEAD_DEPT:
/* Compute total, average, smallest and largest department budget.
*Parameters:
* department id
*
*Returns:
* total budget
* average budget
* min budget
* max budget
*/

5
SET TERM !! ;
CREATE PROCEDURE sub_tot_budget (head_dept CHAR(3))
RETURNS (tot_budget DECIMAL(12, 2), avg_budget DECIMAL(12, 2),
min_budget DECIMAL(12, 2), max_budget DECIMAL(12, 2))
AS
BEGIN
SELECT SUM(budget), AVG(budget), MIN(budget), MAX(budget)
FROM department
WHERE head_dept = :head_dept

INTO :tot_budget, :avg_budget, :min_budget, :max_budget;


EXIT;
END !!
SET TERM ; !!

Для виклику ПЗ використовується оператор EXECUTE PROCEDURE.


Синтаксис оператора наступний:
EXECUTE PROCEDURE name [param[, param …]];

де name – ім’я ПЗ, яка існує у БД, param – вхідні параметри (константи).

Наступна інструкція демонструє виклик виконуваної процедури


DEPT_BUGET:

EXECUTE PROCEDURE DEPT_BUDGET 100;

DROP PROCEDURE name видаляє існуючу ПЗ із бази даних.

В СУБД Oracl є самостійна процедурна мова програмування під назвою


PL/SQL, MS SQL Server, використовується мова язык Transact SQL. Серед
багаточисельних перевагв, притаманних зберігаємим процедурам, достатньо
відмітити дві основні: хранимі процедури виконуються на серверах баз даних і
6
дозволяють визначити інтерфейси. При запуску процедур на сервері (котрий, як
правило, набагато більш продуктивний у порівнянні з персональними
станціями) прикладна програма буде виконуватися набагато швидше. Цей
висновок справедливий у тому випадку, якщо сервер працює на тому ж
комп’ютері, що і додаток, - оскільки зберігаємі процедури виконуються
безпосередньо ядром СУБД. A іменовані інтерфейси забезпечують настільки ж
прості можливості звертання до зберігаємих процедур, як і при використанні
звичайних функцій.

5.3 ЗАВДАННЯ НА ЛАБОРАТОРНУ РОБОТУ


1. Створити пакет процедур;
2. Створити функцію для кожної таблиці, де є первинний ключ, що
генерується послідовністю. Функція у якості параметрів приймає значення
полів запису, крім первинного ключа. Функція повинна отримати з
послідовності новий первинний ключ і вставляти новий запис з цим ключем та
з вказаними у вигляді параметрів значеннями полів. Після виконання функція
повинна повертати первинний ключ вставленого запису або null, якщо запис не
був вставлений.
3. Всі процедури повинні передбачати обробку аномальних ситуацій.
4. Навести список аномалій для кожної підпрограми.
5. Скрити вихідний текст процедури.
6. Навести лістинг і спецификації пакету.
7. Навести приклади роботи з пакетом.

Варіанти лабораторної роботи 5


Необхідно створити:
Варіант №1
1. Процедуру, яка передає виготовлення деталі успішній бригаді.

7
2. Функцію за номером бригади, що повертає рядок з наведеними через кому
деталями, які вона випускає (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, яка видаляє записи деталі, які не випускає жодна з бригад.
Варіант №2
1. Процедуру, яка по номеру рахунка визначає нарахування за рік.
2. Функцію по № рахунка, що повертає рядок, в якому через кому наведені
прізвище вкладника, кількість коштів на рахунку (функція повинна бути
доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про зміни у рахунку за минулий рік.

Варіант №3
1. Процедуру, яка за номером моделі і матеріалу, визначає модель як
молодіжну. Якщо такий запис був без дати визначення, то в це поле
заноситься теперішня дата.
2. Функцію по № моделі, що повертає рядок, в якому через кому наведені
назву моделі, назву матеріала (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про неходові моделі за минулий рік.
Варіант №4
1. Процедуру, яка по номеру рейса і за поганих погодних умов назначає літаку
інший рейс.
2. Функцію по № рейса, що повертає рядок, в якому через кому наведені
прізвища членів екіпажу (функція повина бути доступною для використання в
SQL операторах).
3. Процедуру, що видаляє всі записи про перенесення рейсів за минулий рік.
Варіант №5
1. Процедуру, яка по номеру телефону абонента визначає оплату за
розмови. Якщо не було запису про сплату розмов за попередній термін, то в
це поле заноситься сумарна оплата.

8
2. Функцію по № абонента, що повертає рядок, в якому через кому
наведені прізвище абонента, оплата за телефон (функція повина бути
доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про оплату за позаминулий
рік.
Варіант №6
1. Процедуру, що автоматично призначає премію передплатнику, який
передплатив на більшу суму.
2. Функцію за адресою передплатника, що повертає рядок, в якому через кому
наведені назви видань (функція повина бути доступною для використання в
SQL операторах).
3. Процедуру, що видаляє всі записи про передплатників, які не передплатили
жодного видання.
Варіант №7
1. Процедуру, що автоматично ділить групи на підгрупи, якщо у групі
навчається більше 20 студентів.
2. Функцію за назвою групи, що повертає рядок, в якому через кому
наведені номера відповідних лабораторій і час занять (функція повина бути
доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи у розкладі про групи за
виключенням однієї, якщо є накладка.
Варіант №8
1. Процедуру, що автоматично призначає премію водію, який найбільш
успішно працює.
2. Функцію за назвою вантажу, що повертає рядок, в якому через кому
наведені номера рейсів, водіїв (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє записи про вантажі, які всі перевезені.
Варіант №9

9
1. Процедуру, що автоматично припиняє доставку, якщо будматеріали
скінчились;
2. Функцію за назвою будматеріалу, що повертає рядок, в якому через кому
наведена кількість наявних і використаних матеріалів (функція повина бути
доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про будматеріали, які всі доставлені.
Варіант №10
1. Процедуру, що автоматично збільшує кількість фуражу корови, яка має
більшу продуктивність.
2. Функцію за прізвиськом корови, що повертає рядок, в якому через кому
наведені надої, фураж (функція повинна бути доступною для використання в
SQL операторах)
3. Процедуру, що видаляє всі записи про фураж позаминулого року.
Варіант №11
1. Процедуру, що автоматично встановлює ставку робітнику, при зміні його
посади.
2 Функцію за прізвищем робітника, що повертає рядок, в якому через кому
наведені табельний номер робітника, кількість відпрацьованих змін в місяц
(функція повинна бути доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про робітників, що звільнились.
Варіант №12
1. Процедуру, що автоматично визначає державу, як країну з ринковою
економікою, якщо регулювання економіки відмінено.
2. Функцію за назвою держави, що повертає рядок, в якому через кому наведені
ВВП, наявність лісів (функція повина бути доступною для використання в
SQL операторах).
3. Процедуру, що видаляє всі записи про бідність, якщо середні доходи
збільшились у два рази.
Варіант №13

10
1. Процедуру, що автоматично зараховує абітурієнта, якщо він сдав іспити на
п’ятірки.
2 Функцію за прізвищем абітурєнта, що повертає рядок, в якому через кому
наведені номер екзаменаційного листа, кількість зданих іспитів (функція
повина бути доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про абітурієнтів, що забрали документи.
Варіант №14
1. Процедуру, що автоматично призначає на гру переможців попереднього
туру.
2. Функцію за призвищем шахиста, що повертає рядок з номерами (через кому)
шахистів, які йому програли (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє записи про відкладені партії, якщо партії завершено.
Варіант №15
1. Процедуру, що автоматично призначає знижку на товари, якщо закінчився
сезон.
2. Функцію за номером покупця, що повертає рядок, в якому через кому
наведені призвище покупця та номери його покупок (функція повина бути
доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про продавців, які звільнилися місяць
тому.
Варіант №16
1. Процедуру, що автоматично визначає інше місце рибалки, якщо ресурси
вичерпано.
2. Функцію за номером бригади, що повертає рядок, в якому через кому
наведені прізвище бригадира, улов 31 жовтня (функція повинна бути
доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про улов, якщо ресурси вичерпано.

11
Варіант №17
1. Процедуру, яка збільшує платню кожному програмісту на 2*(кількість мов,
що він знає на 7 і більше балів)%.
2. Функцію за номером службовця, що повертає рядок з наведеними через кому
мовами, які він опанував (функція повина бути доступною для використання
в SQL операторах).
3. Процедуру, яка видаляє записи про мови програмування, які не знає жоден
службовець.
Варіант №18
1. Процедуру видачі книги, що за номером книги і читача додає новий запис у
таблиці зв’язку, якщо цей читач не є боржником.
2. Функцію за номером читача, що повертає рядок, в якому через кому
наведені наявні у нього книги (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про видачу книг за минулий рік (крім
записів про книги, які не повернені).
Варіант №19
1. Процедуру, що автоматично призначає старостами груп (де ще не має
старости) студентів з цих груп, які найбільш успішно навчаються.
2. Функцію за назвою спеціальністі та № курсу, що повертає рядок, в якому
через кому наведені номера відповідних груп (функція повинна бути
доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про групи, в яких не має студентів.
Варіант №20
1. Процедуру, що за номером книги і номером автора додає автора в кінець
списку авторів.
2. Функцію за № книги, що повертає рядок, в якому через кому наведені
прізвища і ініціали її авторів (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про авторів, у яких немає книг.

12
Варіант №21
1. Процедуру, що за номером предмета і номером викладача, у випадку якщо
викладач є професором і викладає цей предмет, призначає його ведучим
викладачем по предмету.
2. Функцію по № викладача, що повертає рядок, в якому через кому наведені
предмети, які він викладає (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про викладачів, які не викладають
жодного предмету.
Варіант №22
1. Процедуру, яка збільшує складність гуманітарних предметів на 1,
профільних на 2, а фундаментальних – зменшує на 1.
2. Функцію за № предмета, що повертає рядок, в якому через кому наведені
групи, де цей предмет вивчають (функція повинна бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про предмети, які не вивчає жодна група.
Варіант №23
1. Процедуру, яка обчислює відсоток знижки: першим 3 клієнтам по обсягу
замовлення – 15%, наступним 7 – 10% і останнім, що зробили хоча б одне
замовлення, - 5%.
2. Функцію по № фірми, що повертає рядок, в якому через кому наведені
номери замовлень фірми (функція повинна бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про торішні замовлення.
Варіант №24
1. Процедуру, яка по номеру студента і кімнати переселяє його у нову кімнату.
Якщо був запис про його мешкання у іншій кімнаті без дати виселення, то в
це поле заноситься теперішня дата.

13
2. Функцію по № кімнати, що повертає рядок, в якому через кому наведені
прізвіща студентів, які там мешкають (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про переселення студента за минулий рік.
Варіант №25
1. Процедуру, яка за номером залікової книжки автоматично заносить
теперішній час в поле “час завершення роботи”.
2. Функцію по № кімнати, що повертає строку, в якій через кому наведені не
зайняті і працюючі комп’ютери (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про роботу за минулий рік.
Варіант №26
1. Процедуру, яка за номером хворого та номером діагнозу додає новий
запис у таблицу діагнозов хворих. І якщо цей діагноз уточнює попередній
діагноз, то видаляє запис про нього.
2. Функцію по № хворого, що повертає рядок, в якому через кому наведені
назви його хвороб (функція повина бути доступною для використання в SQL
операторах).
3. Процедуру, що видаляє всі записи про хворих, яки народились до 1900
року.
Варіант №27
1. Процедуру, яка за номером картки пацієнта додає запис про хвороби у
таблицю клієнта.
2. Функцію по номеру лікаря, що повертає рядок, в якому через кому наведені
прізвище та номер кабінету (функція повина бути доступною для
використання в SQL операторах).
3. Процедуру, що видаляє всі записи про пацієнтів, які забрали картки.
Варіант №28
1. Процедуру, яка за табельним номером співробітника та номером фаху додає
новий запис про курси у таблицу навчання.

14
2. Функцію по номеру курсів, що повертає рядок, в якому через кому наведені
прізвища співробітників, які прослухали цей курс (функція повинна бути
доступною для використання в SQL операторах).
3. Процедуру, що видаляє всі записи про звільнених співробітників.

15
5.4 МЕТОДИКА ВИКОНАННЯ
Створення процедур схоже до опису інших об’єктів. У лівому вікні
обираємо Процедуры і створюємо новий об’єкт.

.
У вікні, що з’явилось, схожа структура до розглянутих вище об’єктів:

16
Потрібно задати ім’я нової процедури в полі:

,
а також параметри процедури в полі:

.
Параметри задаються послідовно: ім’я, тип, якщо потрібно – довжина.

Додати новий параметр можна, використовуючи кнопки на панелі


інструментів:

Тіло процедури задається в нижньому полі:

5.5 ЗМІСТ ЗВІТУ


Розділ “Результати роботи” повинен містити скрипти і результати запитів.

17

You might also like