110
Вступ. Моделі даних Марченко Анна Вікторівна 2015

Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Вступ. Моделі данихМарченко Анна Вікторівна

2015

Page 2: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор
Page 3: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

6

6

6

7

7788

10

10111111

11131314151516

16171818

181920202121

2121222323

232323

2327282829

30

30

30

3131

ЗмістВступ. Моделі даних

Ключові терміни:ТЕМА 1 МОДЕЛІ ДАНИХ 11IM SECTION 1

1.1 Класифікація моделей даних1.1.1. Поняття даних.1.1.2. Класифікація моделей даних.

Інфологічна модель данихДаталогічна модель

1.2 Модель інвертованих списків.2.1. Структура інвертованих таблиць.1.2.2. Операції над даними інвертованих таблиць.1.2.3. Обмеження цілісності.

1.3 Ієрархічна модель даних1.3.1. Ієрархічна структура даних.1.3.2. Операції над ієрархічною структурою.

Вибірка данихМаніпулювання даними.

1.3.3. Обмеження цілісності.1.3.4. Переваги та недоліки ієрархічної моделі.

1.4 Мережева модель даних1.4.1. Мережна структура даних.1.4.2. Операції над мережевою структурою.1.4.3. Переваги та недоліки мережної моделі.

1.5 Постреляційна модель даних.1.5.1. Постреляційна структура даних.1.5.2. Операції над даними.1.5.3. Структура вкладених таблиць.1.5.4. Структура вкладених реляційних відношень.1.5.5. Переваги та недоліки постреляційної моделі даних.

1.6 Об’єктно-орієнтована модель даних1.6.1. Структура моделі даних.1.6.2. Операції маніпулювання даними.1.6.3. Обмеження цілісності в об’єктній моделі.1.6.4. Переваги та недоліки об’єктно-орієнтованої моделі даних.

1.7 Об’єктно-реляційна модель даних.1.7.1. Структура моделі даних.1.7.2. Переваги та недоліки об’єктно-реляційної моделі даних.

1.8 Багатовимірна модель даних1.8.1. Багатовимірна структура даних.1.8.2. Операції над багатовимірною структурою даних.1.8.3. Переваги та недоліки багатовимірної моделі даних.1.8.4. Сфери використання.

ВисновкиМодель даних SQL

ТЕМА 2 ВВЕДЕННЯ В МОДЕЛЬ ДАНИХ SQL 12IM SECTION 21.1 Типи і структури даних SQL

1.1.1. Tочні числові типи.Істинно цілі типи

Зміст 3

Page 4: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

31323233333434353535363636363636

37373839

393939404041414142434545464747

48494950

51

51

51515252535353545556

565859

Точні типи, що допускають наявність дробової частини1.1.2. Наближені числові типи.1.1.3. Типи символьних рядків.1.1.4. Типи бітових рядків.1.1.5. Типи дати і часу.1.1.6. Типи тимчасових інтервалів.1.1.7. Булевський тип.1.1.8. Типи колекцій.

Типи масивівТипи мультимножин.

1.1.9. Анонімні рядкові типи.1.1.10. Типи, визначені користувачем.

Структурні типи (Structured Types).Індивідуальні типи (Distinct Types).

1.1.11. Посилальні типи.1.2 Засоби визначення, зміни визначення та відміни доменів

1.2.1. Визначення домену.1.2.2. Зміна визначення домену.1.2.3. Ліквідація домену.

1.3 Засоби визначення базових таблиць та обмежень цілісності1.3.1. Засоби визначення базових таблиць.

Визначення базової таблиціВизначення стовпцяЗначення стовпця за замовчуваннямОбмеження цілісності стовпця

1.3.2. Визначення табличного обмеження.Табличне обмеження первинного або можливого ключаТабличне обмеження зовнішнього ключа

1.3.3. Підтримка посилальної цілісності і посилальні дії.1.3.4. Приклади визначення таблиць.1.3.5. Зміна визначення базової таблиці.

Додавання, зміна або видалення визначення стовпцяЗміна набору табличних обмежень.

1.3.6. Видалення базової таблиці.1.4 Засоби визначення та скасування загальних обмежень цілісності

1.4.1. Визначення загальних обмежень цілісності.1.4.2. Видалення загального обмеження цілісності.1.4.3. Негайна і відкладена перевірка обмежень.

ВисновкиТЕМА 3 ЗАСОБИ МАНІПУЛЮВАННЯ ДАНИМИ МОВИ

3.1 Базові засоби маніпулювання данимиОператор INSERT для вставки рядків в існуючі таблиці

Загальний синтаксис оператора INSERTВставка явно заданого набору рядківВставка рядків результату запиту

Оператор UPDATE для модифікації існуючих рядків в існуючих таблицяхЗагальний синтаксис оператора UPDATE

Оператор DELETE для видалення рядків в існуючих таблицяхПодання, над якими можливі операції оновленняКритерії можливості застосування операцій оновлення

3.2 Правила функціональної залежностіОсновні визначення та поняттяРозділ WITH CHECK OPTION визначення уявленняРежими перевірки CASCADED і LOCAL

Зміст 4

Page 5: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

60

6060616161616162636464

65

65

65

65666666676868

69

69

70

71

71

71

72

72

73

74

74

74

74

74

75

76

76

76

76

78

79

79

79

79

80

80

80

80

3.3 Операції оновлення баз даних і механізм тригерівПоняття тригера в SQL: 1999Синтаксис визначення тригерів і типи тригерів

Тригери BEFORE і AFTERТригери INSERT, UPDATE і DELETEТригери ROW і STATEMENTРозділ WHENТіло тригераВиконання тригерівМожливості використання старих і нових значеньОбробка декількох тригерів, пов’язаних з однієї предметної таблицею

ВисновкиТЕМА 4 УПРАВЛІННЯ ТРАНЗАКЦІЯМИ ЗАСОБАМИ SQL

4.1 ACID-транзакція4.2 Породження транзакцій в SQL: +1999

4.2.1. Установка характеристик транзакції.4.2.2. Явна ініціація транзакції.4.2.3. Рівні ізоляції SQL-транзакції

Феномен "брудного" читання (dirty read)Феномен неповторюваного читання (unrepeatable read)Феномен фантомів

4.3 Завершення транзакцій4.5 Транзакції і обмеження цілісності4.6 Точки збереженняВисновки

Основи мови PL/SQLКлючові терміни:5.1 АЛФАВІТ І ЛЕКСЕМИ МОВИ. СТРУКТУРА ПРОГРАМИ5.2 ТИПИ ДАНИХ ТА ОГОЛОШЕННЯ ЗМІННИХ

5.2.1. Оголошення скалярних типів даних.5.2.2. Оголошення змінних типу RECORD (записи).

5.3 ОПЕРАТОРИ5.3.1. Оператор присвоювання5.3.2. Оператор циклу LOOP.

5.4 КУРСОРИ5.4.1. Явний курсор.5.4.2. Неявні курсори.

5.5 ОБРОБКА ВИНЯТКОВИХ СИТУАЦІЙ5.5.1. Стандартні виняткові ситуації.5.5.2. Користувальницькі виняткові ситуації.5.5.3. Приклади.

ВИСНОВКИТЕМА 6 ТРИГЕРИ БАЗИ ДАНИХ 16IM SECTION 6

6.1 Призначення тригерів6.2 Створення і включення тригерів6.3 Класифікація тригерів.6.4 Порядок активізації тригерів.6.5 Тригерні предикати.6.6 Псевдозаписи.6.7 Включення, виключення і видалення тригерів.

Зміст 5

Page 6: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

81

82

83

83

83

84

84

85

85

86

86

88

89

89

90

91

93

93

95

97

99

100

101

101

102

103

104

105

106

106107109

5.2 Приклади створення тригерівВисновки

7.1 ТИПИ ПРОЦЕДУР І ФУНКЦІЙ7.2 СТВОРЕННЯ ЗБЕРЕЖЕНИХ ПРОЦЕДУР І ФУНКЦІЙ7.3 ПАРАМЕТРИ ПРОЦЕДУР І ФУНКЦІЙ (ПІДПРОГРАМ)7.3 ПОРЯДОК ЗАВДАННЯ ПАРАМЕТРІВ.7.4 ПІДПРОГРАМИ І ЗАЛЕЖНОСТІ. ПЕРЕКОМПІЛЯЦІЯ ПІДПРОГРАМ7.5 ОТРИМАННЯ ІНФОРМАЦІЇ ПРО ЗБЕРЕЖЕНІ ПРОЦЕДУРИ І ФУНКЦІЇ7.6 ПРИКЛАДИ.

Ключові терміни:8.1 СТРУКТУРА ПАКЕТА8.2 СТВОРЕННЯ І ІНІЦІАЛІЗАЦІЯ ПАКЕТУ8.3 ПЕРЕВАГИ ПАКЕТІВ.8.4 ЗАЛЕЖНОСТІ І ПЕРЕКОМПІЛЯЦІЯ МОДУЛЯ9.1 СТВОРЕННЯ ОБ’ЄКТНОГО ТИПУ9.2 ОГОЛОШЕННЯ І ІНІЦІАЛІЗАЦІЯ ОБ’ЄКТІВ9.3 КЛЮЧОВЕ СЛОВО SELF.9.4 РОЗМІЩЕННЯ ОБ’ЄКТІВ В БАЗІ ДАНИХ9.5 ОПЕРАЦІЇ REF І DEREF.9.6 МЕТОДИ MAP І ORDER9.7 ЗМІНА ТА ВИДАЛЕННЯ ТИПІВ

Основи роботи в СУБД Oracle.10.1. ХАРАКТЕРИСТИКА СУБД ORACLE10.2 ОБ’ЄКТИ БАЗИ ДАНИХ ORACLE10.3 СЛОВНИК ДАНИХ ORACLEТЕРМІН БАЗА ДАНИХ ORACLE ВИКОРИСТОВУЄТЬСЯ ДЛЯ ПОЗНАЧЕННЯФІЗИЧНОЇ ТА ЛОГІЧНОЇ СТРУКТУР ДАНИХ СПІЛЬНО ЗІ ВСІЄЮ СЛУЖБОВОЮІНФОРМАЦІЄЮ. ЩОБ РОЗДІЛИТИ ОПИС ЛОГІЧНОЇ ОРГАНІЗАЦІЇ ДАНИХ ВІДСПОСОБІВ ЇХ ЗБЕРІГАННЯ ТА ДОСТУПУ ДО НИХ, В ORACLEВИКОРИСТОВУЄТЬСЯ ДВОРІВНЕВА ОРГАНІЗАЦІЯ БД. ОБ’ЄКТИВЕРХНЬОГО (ЛОГІЧНОГО) РІВНЯ НАЗИВАЮТЬСЯ ЛОГІЧНИМИСТРУКТУРАМИ, А ОБ’ЄКТИ НИЖНЬОГО (ФІЗИЧНОГО) РІВНЯ – ФІЗИЧНИМИСТРУКТУРАМИ БД.

11.1 Фізична організація БД Oracle11.2 Логічна структура БД Oracle11.3 Архітектура екземпляра бази даних Oracle

11.3.1. Процеси екземпляра.11.3.2. Структури пам’яті екземпляра.

11.4 Формування бази даних і екземпляра Oracle

Вступ. Моделі даних 6

Page 7: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Вступ. Моделі даних

Тема 1 Моделі даних 11Im Section 11.1 Класифікація моделей даних

1.1.1. Поняття даних.1.1.2. Класифікація моделей даних.

Інфологічна модель данихДаталогічна модель

1.2 Модель інвертованих списків.2.1. Структура інвертованих таблиць.1.2.2. Операції над даними інвертованих таблиць.1.2.3. Обмеження цілісності.

1.3 Ієрархічна модель даних1.3.1. Ієрархічна структура даних.1.3.2. Операції над ієрархічною структурою.

Вибірка данихМаніпулювання даними.

1.3.3. Обмеження цілісності.1.3.4. Переваги та недоліки ієрархічної моделі.

1.4 Мережева модель даних1.4.1. Мережна структура даних.1.4.2. Операції над мережевою структурою.1.4.3. Переваги та недоліки мережної моделі.

1.5 Постреляційна модель даних.1.5.1. Постреляційна структура даних.1.5.2. Операції над даними.1.5.3. Структура вкладених таблиць.1.5.4. Структура вкладених реляційних відношень.1.5.5. Переваги та недоліки постреляційної моделі даних.

1.6 Об’єктно-орієнтована модель даних1.6.1. Структура моделі даних.1.6.2. Операції маніпулювання даними.1.6.3. Обмеження цілісності в об’єктній моделі.1.6.4. Переваги та недоліки об’єктно-орієнтованої моделі даних.

1.7 Об’єктно-реляційна модель даних.1.7.1. Структура моделі даних.1.7.2. Переваги та недоліки об’єктно-реляційної моделі даних.

1.8 Багатовимірна модель даних1.8.1. Багатовимірна структура даних.1.8.2. Операції над багатовимірною структурою даних.1.8.3. Переваги та недоліки багатовимірної моделі даних.1.8.4. Сфери використання.

Висновки

Ключові терміни:* , дані, модель даних, транзакція, інфологічна модель даних, ієрархічна база даних,ієрархічна структура даних

ТЕМА 1 МОДЕЛІ ДАНИХ 11IM SECTION 1

Вступ. Моделі даних 7

Page 8: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

1.1 Класифікація моделей даних

1.1.1. Поняття даних.Слово «дані» походить від латинського «datum» – факт, проте дані не завжди відповідаютьконкретним чи навіть реальним фактам. Іноді вони неточні або описують те, чого насправді неіснує. Даними ми вважатимемо опис будь-якого явища (чи ідеї), що викликає зацікавленістьчерез певні потреби. З даними нерозривно пов’язана їхня інтерпретація (або семантика), тобтотой зміст, який їм приписується.

Дані описуються тією чи іншою мовою і фіксуються на певному носії (скажімо, папері).Зазвичай дані (факти) та їхня семантична інтерпретація фіксуються спільно. Проте в деякихвипадках дані й інтерпретація розділяються. Так, у зведеній статистичній таблиці зверху, в їїшапці, міститься інформація стосовно того, чим є дані (заголовок таблиці, описова інформація,назви стовпців тощо), а нижче розташовуються власне рядки чисел.

Застосування комп’ютерів для введення й обробки даних сприяло ще більшому розділеннюданих та їхньої інтерпретації. Оскільки комп’ютери оперують даними як такими, велика частинаінтерпретуючої інформації взагалі явно не фіксується. Програма одержує певні вхідні дані,обробляє їх і видає результат у вигляді сукупності вихідних даних.

З розвитком обчислювальної техніки з’явилася можливість фіксувати за допомогоюкомп’ютерів семантику даних, тобто закладати інтерпретацію в програми, що оперуютьданими. Проте за умов спільного використання даних різноманітними прикладними програмамицей підхід можна застосовувати лише частково. Інакше процес написання програм, які містятьсхожі, хоча й не ідентичні механізми інтерпретації, стає неефективним. У подібній ситуаціїдоцільно зв’язувати дані з механізмами інтерпретації, що має забезпечувати уніфікованістьподання семантичної інформації. У результаті змінюється роль даних: їх уже не можнарозглядати лише як сукупність бітів, вони отримують певне семантичне навантаження. Засобиінтерпретації мають бути гнучкими, аби разом з незмінними параметрами даних відображати йаспекти їхньої еволюції. Цього досягають двома способами. По-перше, можна відтворюватирізні погляди на одні й ті самі дані. Наприклад, розглядати певну особу з точки зору кадровоїсистеми як службовця, з погляду виробничих інтересів – як виконавця робіт, а з боку медичногообслуговування – як пацієнта. По-друге, різні дані можна подавати одноманітно. Так,адміністратори, клерки, агенти, секретарі незалежно від роду своєї діяльності можутьрозглядатися в кадровій системі як службовці.

1.1.2. Класифікація моделей даних.Існує багато типів моделей фізичні, математичні, економічні тощо, які відображають різніаспекти реального світу. Модель даних відображує уявлення про реальний світ. Проте важливо,аби обсяг знань і семантика даних, відтворені в моделі, були адекватні способу використанняданих. Вважатимемо, що модель даних це сукупність структури даних, операцій над ними(операції маніпулювання даними) та обмежень цілісності. Іншими словами, модель визначає, вякий спосіб відбувається об’єднання даних у структури різної складності, які існують обмеженняна значення даних і як здійснюється оперування цими даними

Основою для будь-якої структури даних є відображення елементарної одиниці даних увигляді такої трійки: < об’єкт, властивість об’єкта, значення властивості >. Сукупністьвзаємопов’язаних між собою елементарних одиниць даних може відображуватисярізноманітними способами, що приводить до формування різних структур, а відтак – різнихмоделей даних.

Поняття «дані» у концепції баз даних – це набір конкретних значень, параметрів, щохарактеризують об’єкт, умову, ситуацію або будь-які інші фактори. Приклади даних: ПетровМикола Степанович, $30 і т.д. Дані не мають певної структури, дані стають інформацією тоді,коли користувач задає їм певну структуру, тобто усвідомлює їхній семантичний зміст. Томуцентральним поняттям в області баз даних є поняття моделі. Не існує однозначного визначенняцього терміна, у різних авторів ця абстракція визначається з деякими відмінностями, але протеможна виділити щось загальне в цих визначеннях.

Модель даних – це деяка абстракція, яка, будучи застосовна до конкретних даних, дозволяєкористувачам і розроблювачам трактувати їх уже як інформацію, тобто відомості, що містять нетільки дані, але й взаємозв’язок між ними.

На рис. 1.1 представлена класифікація моделей даних.

Вступ. Моделі даних 8

Page 9: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Рисунок 1.1 – Класифікація моделей даних за архітектурою бази данихВідповідно до розглянутої раніше трирівневої архітектури бази даних ми зустрічаємося з

поняттям моделі даних стосовно кожного рівня. І дійсно, фізична модель даних оперуєкатегоріями, що стосуються організації зовнішньої пам’яті й структур зберігання,використовуваних у даному операційному середовищі. В даний момент як фізичні моделівикористовуються різні методи розміщення даних, засновані на файлових структурах: цеорганізація файлів прямого й послідовного доступу, індексних файлів і інвертованих файлів,файлів, що використовують різні методи хешування, взаємозалежних файлів. Крім того, сучасніСУБД широко використовують сторінкову організацію даних. Фізичні моделі даних, засновані насторінковій організації, є найбільш перспективними

Найбільший інтерес викликають моделі даних, які використовуються на концептуальномурівні. Стосовно них зовнішні моделі називаються підсхемами й використовують ті ж абстрактнікатегорії, що й концептуальні моделі даних.

Крім трьох розглянутих рівнів абстракції при проектуванні БД існує ще один рівень, щопередує ім. Модель цього рівня повинна виражати інформацію про предметну область у вигляді,незалежному від використовуваної СУБД. Ці моделі називаються іфологічними, абосемантичними.

Інфологічна модель данихІнфологічні моделі даних – відбивають у природній і зручній для розроблювачів і іншихкористувачів формі інформаційно-логічний рівень абстрагування, пов’язаний з фіксацією йописом об’єктів предметної області, їх властивостей і їх взаємозв’язків.

Діаграма Бахмана являє собою орієнтований граф, у якому вершини відповідають групам(типам записів), а дуги – ієрархічним груповим відносинам.

Прийняті позначення:

прямокутник – об’єкт, усередині прямокутника пишеться ім’я об’єкта й у круглих дужкахможуть бути перераховані атрибути;об’єкти зв’язані між собою спрямованими ребрами, зв’язки підписуються;діаграми призначені для деревоподібних, мережних структур, тому завжди існує вихіднийоб’єкт і підлеглий об’єкт.

Даталогічна модельІнфологічні моделі даних використовуються на ранніх стадіях проектування для опису структурданих у процесі розробки додатка, а даталогічні моделі вже підтримуються конкретними СУБД.

Документальні моделі даних – відповідають уявленню про слабоструктуровану інформацію,орієнтовану в основному на вільні формати документів, текстів природньою мовою.

Моделі, засновані на мовах розмітки документів, зв’язані насамперед зі стандартноюзагальною мовою розмітки – SGML (Standart Generalised Markup Language), який бувзатверджений ISO у якості стандарту ще в 80-х роках. Ця мова призначена для створення іншихмов розмітки, вона визначає припустимий набір тегів (посилань), їхні атрибути й внутрішнюструктуру документа. За допомогою SGML можна описувати структуровані дані, організовуватиінформацію, що втримується в документах, представляти цю інформацію в деякому

Вступ. Моделі даних 9

Page 10: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

стандартизованому форматі. Але через деяку свою складність SGML використовувався восновному для опису синтаксису інших мов (найбільш відомим з яких є HTML), і деякі додаткипрацювали з Sgml-Документами прямо.

Набагато більш проста і зручна, ніж SGML, мова HTML дозволяє визначати оформленняелементів документа й має якийсь обмежений набір інструкцій – тегів, за допомогою якихздійснюється процес розмітки. Інструкції HTML у першу чергу призначені для керуванняпроцесом виводу вмісту документа на екрані програми-клієнта й визначають цим самим спосібвистави документа, але не його структуру.

Однак HTML сьогодні вже не задовольняє повною мірою вимогам, пропонованим сучаснимирозроблювачами до мов подібного роду. І їй на зміну була запропонована нова мовагіпертекстової розмітки, потужний, гнучкий і, одночасно із цим, зручна мова XML.

XML (Extensible Markup Language) – це мова розмітки, що описує цілий клас об’єктівданих, названих XML-документами. Вона використовується як засіб для опису граматики іншихмов і контролю над правильністю складання документів. Тобто сама по собі XML не міститьніяких тегів, призначених для розмітки, він просто визначає порядок їх створення.

Тезаурусні моделі – це моделі, які засновані на принципі організації словників, містять певнімовні конструкції й принципи їх взаємодії в заданій граматиці. Ці моделі ефективновикористовуються в системах-перекладачах, особливо багатомовних перекладачах. Принципзберігання інформації в цих системах і підкоряється тезаурусним моделям.

Дескрипторні моделі – найпростіші з документальних моделей, вони широковикористовувалися на ранніх стадіях використання документальних баз даних. У цих моделяхкожному документу відповідає дескриптор – описатель. Цей дескриптор має тверду структуруй описує документ відповідно до тих характеристик, які потрібні для роботи з документами врозроблювальній документальній БД. Наприклад, для БД, що містить опис патентів, дескриптормістить назву області, до якої відноситься патент, номер патенту, дату видачі патенту й щеряд ключових параметрів, які заповнюються для кожного патенту. Обробка інформації в такихбазах даних велася винятково по дескрипторах, тобто по тим параметрам, які характеризувалипатент, а не по самому тексту патенту.

Фактографічні моделі – містять відомості, які представлені у вигляді спеціальним чиноморганізованих сукупностей формалізованих записів даних.

Кожний з таких екземплярів структурних елементів або деяка їхня сукупність відбиваютьвідомості про який-небудь факт, подію і т.д., відділеному (вичленованому) від усіх іншихвідомостей і фактів. Структура кожного типу інформаційного об’єкта складається з кінцевогонабору реквізитів, що відбивають основні аспекти й характеристики відомостей для об’єктівданої предметної області. Приміром, фактографічна АІС, що накопичує відомості по особах,кожній конкретній особі в базі даних ставить у відповідність запис, що складається з певногонабору таких реквізитів, як прізвище, ім’я, по батькові, рік народження, місце роботи і т.д.

Комплектування інформаційної бази у фактографічних АІС включає, як правило, обов’язковийпроцес структуризації вхідної інформації з документального джерела. Структуризація прицьому здійснюється через визначення (виділення, вичленовування) екземплярів інформаційнихоб’єктів певного типу, інформація про яких є в документі, і заповнення їх реквізитів.

Серед фактографічних інформаційних систем виділяють два класи:

системи операційної обробки даних;системи, орієнтовані на аналіз даних і підтримку ухвалення рішення.

Системи операційної обробки данихДля позначення таких систем використовується термін OLTP (On-Line Transaction Processing –

оперативна обробка транзакцій або виконання транзакцій у режимі реального часу). Такісистеми розраховані на обслуговування щодо простих запитів великої кількості користувачів.

Логічною одиницею функціонування таких систем є – транзакція, яка являє собою неподільнупослідовність операцій маніпулювання даними (читання, видалення, вставка й зміна).Неподільність визначає факт фіксування змін, зроблених над даними, якщо всі операції, щовходять у транзакцію виконані успішно. Якщо ж хоча б одна з операцій не виконана, то жодне зізмін е відбивається на стані даних.

Інформаційна система будується як система OLTP, якщо при її функціонуванні неминучінаступні аспекти роботи:

Одночасний доступ. Безліч користувачів звертаються до одного і того же запису, однак уконкретний момент часу тільки одному з них необхідно дозволити внесення змін. Приклад:продаж квитків.Цілісність змін. Усі зміни в базі даних не повинні порушувати цілісності збережених даних, адля цього взаємозалежні кроки зміни повинні сприйматися системою як єдине ціле.Приклад: переклад коштів.

Вступ. Моделі даних 10

Page 11: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Системи, орієнтовані на аналіз данихДля позначення таких систем використовується термін – OLAP (On-Line Analytical Processing –

системи оперативної аналітичної обробки). Вони орієнтовані на аналіз даних і забезпечуютьодержання інформації, необхідної для розробки рішень у сфері керування. До систем OLAPможна віднести систему підтримки прийняття рішень – людино-машинний обчислювальнийкомплекс, орієнтований на аналіз даних, що й забезпечує одержання інформації, необхідної длярозробки рішень у сфері керування.

До завдань, розв’язуваних такими системами, відносять: оцінку альтернатив рішень,прогнозування, класифікація, виявлення асоціацій і ін.

Однією з основних вимог до сучасної OLAP-систем є надійність зберігання даних, тобтоздатність відновлювати пошкоджений стан бази даних після будь-яких апаратних абопрограмних збоїв.

Розв’язок цієї проблеми реалізується за допомогою журналу транзакцій, під яким розумієтьсяособлива частина БД, недоступна користувачам і підтримувана з особливою старанністю (кількакопій, розташованих на різних фізичних дисках), що й містить послідовність дій про всі зміни вБД.

Основою побудови такої системи є концепція сховища даних, яке забезпечує можливістьаналізу накопичених даних і представляється собою інтегровані набори даних, зібраних з різнихджерел (наприклад: систем оперативного доступу до даних, електронних архівів і ін.)

Засновником даної концепції є Білл Инмон ( 1992 р. у книзі «Створення сховища даних»визначив сховище даних так – «предметно-орієнтований, інтегрований, незмінний іпідтримуючий хронологію набір даних, призначений для підтримки прийняття розв’язків»).

Усім сховищам даних властиві такі властивості:

Предметна орієнтованість. Інформація в сховищі даних організована відповідно доосновних аспектів діяльності підприємства (замовники, продажі, склад і т.п.); це йвідрізняє сховище даних від даних системи оперативної обробка, де дані організованівідповідно до процесів (виписка рахунків, відвантаження товару й т.п.).Інтегрованість. Вихідні дані вилучаються із систем оперативної обробки, перевіряються,очищаються, приводяться до єдиного виду, у потрібному ступені агрегуютсяПрив’язка до часу. Дані в сховище завжди прямо пов’язані з певним періодом часу. Данінакопичуються в сховище у вигляді «історичних шарів», кожний з яких ставиться доконкретного періоду часу. Це дозволяє аналізувати тенденції розвитку.Незмінюваність. Дані після завантаження в сховище даних не можуть бути змінені, тобтов цілому в сховище ніяких змін, крім додавання нових записів, не передбачається.Важливою умовою незмінності даних є використання надійного встаткування, щозабезпечує захист від збоїв.

Існують такі типи фактографічних моделей:Теоретико-графова модель – це модель даних, у якій дозволені структури даних можуть бути

представлені у вигляді граф загального або спеціального виду, наприклад дерева.Теоретико-множинна модель – це модель даних, у якій використовується апарат реляційної

алгебри, реляційного обчислення, а також операції над даними маніпулюються таблицями.Об’єктно-орієнтована модель – це модель даних, яка базується на понятті об’єкта, тобто

сутності, яка володіє станом й поведінкою.Стан об’єкта визначається його атрибутами, а поведінка визначається сукупністю операцій,

які визначені для цього об’єкта. Також передбачається можливість підтримки зв’язків міжтипами об’єктів.

1.2 Модель інвертованих списківДо числа найбільш відомих і типових представників таких систем відносяться Datacom/DBкомпанії Applied Data Research, Inc. (ADR), орієнтована на використання на машинах основногокласу фірми IBM, і Adabas компанії Software AG.

.2.1. Структура інвертованих таблиць.Структура бази даних, організована за допомогою інвертованих списків, певною мірою схожа нареляційну – дані зберігаються у вигляді таблиць (рис.1.2), але, на відміну від реляційної БД,збережені таблиці даних і шляхи доступу до них видні й доступні користувачеві. При цьомурядки (записи) таблиць упорядковані системою в деякій фізичній послідовності. Для кожноїтаблиці можна визначити довільне число ключів пошуку, для яких будуються індекси. Ці індексиавтоматично підтримуються системою, але явно видні користувачам.

Вступ. Моделі даних 11

Page 12: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Номер залікової книжки Прізвище та ініціали студента Факультет Курс12030090 Бахмач Микола Валентинович ЕлІТ 112030094 Бичко Дмитро Віталійович ТЕСЕТ 214030069 Бутурлім В’ячеслав Борисович ЕлІТ 312030157 Кошара Віктор Сергійович ТЕСЕТ 412030167 Лисенко Ігор Сергійович ФЕМ 1Рисунок 1.2 – Таблиця бази даних, побудованої на основі інвертованих списків

1.2.2. Операції над даними інвертованих таблиць.Підтримуються два класи операторів:

Оператори, що встановлюють адресу записа, серед яких: прямі пошукові оператори(наприклад, знайти перший запис таблиці по деякому шляху доступу); оператори, щознаходять запис у термінах відносної позиції від попереднього запису по деякому шляхудоступу.Оператори над записами, які адресуються.

Типовий набір операторів над записами, які адресуються:

LOCATE FIRST – знайти перший запис таблиці T у фізичному порядку; повертає адресазапису;LOCATE FIRST WITH SEARCH KEY EQUAL – знайти перший запис таблиці T із заданимзначенням ключа пошуку K; повертає адреса запису;LOCATE NEXT – знайти перший запис, що випливає за записом із заданою адресою взаданому шляху доступу; повертає адреса запису;LOCATE NEXT WITH SEARCH KEY EQUAL – знайти наступний запис таблиці T із заданимзначенням K;RETRIVE – вибрати запис із зазначеною адресою;UPDATE – обновити запис із зазначеною адресою;DELETE – вилучити запис із зазначеною адресою;STORE – включити запис у зазначену таблицю; операція генерує адресу запису.

1.2.3. Обмеження цілісності.Обмеження визначення цілісності БД відсутні. У деяких системах підтримуються обмеженняунікальності значень деяких полів, але в основному все покладається на прикладну програму.

Становить інтерес порівняння властивостей таблиць у СУБД на інвертованих списках татаблиць-відношень у реляційній моделі. У сучасних реляційних СУБД доступ до даних,аналогічний тому, що використовується в системах, заснованих на інвертованих списках, тавикористовуються при побудові індексних структур і від користувача схований.

1.3 Ієрархічна модель данихІєрархічна модель даних уперше була задіяна в системі IMS (Information Management System –інформаційна керуюча система) у межах проекту висадки на Місяць. У першій ієрархічній системібули повністю реалізовані функції СКБД, а саме: мови визначення та маніпулювання даними, описі підтримка обмежень цілісності, паралелізм, відновлення, а також механізми ефективноїобробки запитів. Слід сказати, що IMS і досі використовується на мейнфреймах.

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

1.3.1. Ієрархічна структура даних.Ієрархічна структура даних визначається ієрархічною впорядкованістю своїх компонентів (абовузлів), тобто кожен вузол має не більше одного «батька» – старшого за ієрархією вузла.

Структура складається зі схем елементів даних (описова інформація) та їхніх екземплярів.Інакше кажучи, схема задає логічну структуру (або тип) елементу даних, а екземпляр – йогозначення.

Вступ. Моделі даних 12

Page 13: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Елементарним значенням структури є пойменоване поле даних, а його екземпляр – цеелементарне значення.

Схема сегмента (яку називатимемо також просто сегментом) це пойменована впорядкованасукупність імен полів. Сегмент є одиницею доступу до даних ієрархічної структури під часвзаємодії зовнішньої та оперативної пам’яті. Екземпляр сегмента – впорядкована сукупністьзначень полів.

Ієрархічна схема даних – це ієрархічно впорядкована сукупність сегментів, що має певнівластивості:

на найвищому рівні ієрархії розташований єдиний сегмент, що називається кореневим;кожен інший сегмент, окрім кореневого, зв’язаний з одним і т ільки одним сегментомвищого рівня, який є для нього сегмента батьківським (початковим);сегмент може бути зв’язаний з одним або кількома сегментами нижчого рівня, якіназиваються дочірніми (породженими);сегменти, що підпорядковані одному батьківському сегменту, називаються близнюками;сегменти, що не мають дочірніх, вважаються листковими, або їх ще називають листками.

Ієрархічний шлях (або просто шлях) – це послідовність сегментів, починаючи з кореневого, декожний попередній є «батьком» наступного. Рівень сегмента визначається як кількістьсегментів, що містяться на шляху, який веде від кореня до даного сегмента.

Для ієрархічної схеми використовується така графічна нотація:

Кожний сегмент зображується у вигляді пойменованого прямокутника. Усерединіпрямокутника записуються імена полівІєрархічний зв’язок між сегментами позначається лініями зі стрілками, що проведені відбатьківського сегмента до дочірнього. Батьківські сегменти, як правило, розміщують наддочірніми.

Приклад графічного зображення простої ієрархічної схеми даних наведений на рис.1.3, а. Якщонемає необхідності уточнювати сегменти полями, що зазвичай робиться під час загальногоаналізу ієрархічної структури предметної області, то в прямокутнику сегмента зазначаєтьсяйого ім’я (рис. 1.3, б).

а бРисунок 1.3 – Приклад структури ієрархічної моделі данихЕкземпляр ієрархічної схеми даних складається з одного екземпляра кореневого сегмента і,

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

кожний екземпляр будь-якого сегмента підпорядкований одному екземплярубатьківського сегмента;екземпляр будь-якого сегмента (окрім кореневого) не може існувати без відповідногоекземпляра батьківського сегмента;кожний екземпляр сегмента зв’язаний (підпорядковує собі) з усіма екземплярами дочірніхсегментів;екземпляри одного сегмента, зв’язані з одним екземпляром батьківського сегмента,можуть бути зв’язані між собою в ланцюжок, що дає змогу виконувати їхнє послідовнеперебирання у межах усіх сегментів, породжених з одного початкового.

У такий спосіб ієрархічна впорядкованість сегментів створює зв’язок «один- до-багатьох» міжекземплярами батьківського і дочірнього сегментів.

Приклад екземпляра ієрархічної схеми наведений на рис. 1.4.

Вступ. Моделі даних 13

Page 14: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Рисунок 1.4 – Приклад екземпляра ієрархічної структури данихІєрархічна схема інколи має розгалуження, як це показано на рис. 1.5. У подібному випадку на

рівні схеми батьківський сегмент може зв’язуватися з кількома дочірніми сегментами.

Рисунок 1.5 – Приклад розгалуженої структури данихІєрархічна структура даних – це сукупність ієрархічної схеми даних та всіх можливих

екземплярів цієї схеми. Сукупність ієрархічних структур даних називається ієрархічною базоюданих.

1.3.2. Операції над ієрархічною структурою.Операції, що виконуються над ієрархічною структурою, поділяють на дві групи, операції пошуку(чи вибирання) та операції оновлення даних (або маніпулювання ними).

Зазначимо кілька базових принципів, характерних для мов маніпулювання даними ієрархічнихсистем.

Об’єктом маніпулювання є екземпляр сегмента.У результаті успішного виконання пошукових операцій визначається як поточний екземпляр

сегмента, який може відігравати роль стартової позиції для операцій маніпулювання; спочаткупоточним є кореневий екземпляр сегмента.

Пошук необхідного сегмента відбувається за «навігаційним» принципом: необхідно прокластишлях від кореневого екземпляра сегмента (або ж поточного) до шуканого, перевіряючи умови,накладені на значення полів сегментів, які розташовані на шляху, що будується. Операція вієрархічній моделі визначається шляхом програмування «навігації» структурою даних.

В описаних далі операціях було використано мову DL/1 системи IMS, синтаксис якої тут значноспрощений.

Вибірка данихНеобхідний екземпляр сегмента вибирається в ієрархічній структурі за допомогою команди«навігації» структурою. Екземпляр сегмента є одиницею навігації. Для визначення необхідногосегмента навігації може накладатися умова на значення полів сегмента. Відносно поточногосегмента можна переміщуватися ієрархічною структурою вверх, вниз і вбік.

Навігацію ієрархічною структурою можна здійснювати з метою її впорядкування, а потімпереміщуватися нею згідно зі встановленим порядком. Порядок переміщення встановлюється,починаючи з кореня або будь-якого первинного сегмента. Далі рухатись можна зверху донизу ізліва направо.

Доступ до даних здійснюється за допомогою команди GET, різновиди якої розглядаютьсянижче.

GET UNIQUE – пряма вибірка. Вибирання першого сегмента вказаного типу, що відповідаєумові пошуку. За допомогою цієї операції фіксується початкова позиція для подальшої навігаціїієрархією.

GET NEXT – послідовна вибірка. Вибирання сегмента, розташованого відразу за поточним,згідно з наявним порядком розташування сегментів у базі даних. Задаючи різні значенняпараметрів команди, можна отримати

сегмент, який розташований за поточним (при цьому тип сегмента може виявитисядовільним);

Вступ. Моделі даних 14

Page 15: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

наступний сегмент заданого типу;наступний сегмент заданого типу, що відповідає заданій умові.

GET NEXT WITHIN PARENT – послідовна вибірка в межах поточного батьківського сегмента.Розглянемо декілька найпростіших прикладів вибирання даних. Користуватимемось

ієрархічною схемою, що зображена на рис. 1.3.ФАКУЛЬТЕТ(Назва. Декан)КАФЕДРАС (Назва. Завідувач. Корпус)ВИКЛАДАЧ (Ім’я. Посада. Адреса)Команда GET UNIQUE має такий синтаксис: GET UNIQUE <тип сегмента>[WHERE <умова>] За цією командою знаходиться перший сегмент вказаного типу, що відповідає вказаній умові.

Тут <умова> – це предикат, у якому можуть зазначатися будь-які типи сегментів, що єбатьківськими до типу <тип сегмента>, та сам вказаний тип сегмента. Фраза WHERE може бутивідсутня, тоді команда знаходить перший екземпляр сегмента вказаного типу.Розглянемо кілька прикладів.

Перший екземпляр кафедри в корпусі 5 знаходиться у такий спосіб:GET UNIQUE КАФЕДРА WHERE КАФЕДРА.Корпус = 5;Знайдений сегмент стає поточним. Для знаходження професора кафедри АСУ факультету

інформатики слід записати:GET UNIQUE ВИКЛАДАЧWHERE ФАКУЛЬТЕТ.Назва - "інформатики" AND КАФЕДРА.Назва = "АСУ” AND ВИКЛАДАЧ.Посада

= "професор";Пошук першого професора здійснюється згідно з прийнятою впорядкованістю екземплярів

сегментів.Якщо необхідно знайти кілька сегментів, що відповідають умові пошуку, слід скористатися

командою GET NEXT (вона має синтаксис, аналогічний GET UNIQUE). За допомогою цієї командизнаходиться наступний сегмент, що відповідає заданій умові пошуку. * Наприклад, щобпослідовно знайти всіх професорів кафедри математики факультету інформатики, слідвиконати таку команду:

GET UNIQUE ВИКЛАДАЧWHERE ФАКУЛЬТЕТ.Назва - "інформатики” AND КАФЕДРА.Назва = "математики" AND

ВИКЛАДАЧ.Посада = "професор";NT: GET NEXT ВИКЛАДАЧ WHERE ФАКУЛЬТЕТ.Назва - "інформатики" AND КАФЕДРА.Назва =

"математики" AND ВИКЛАДАЧ.Посада = "професор":GOTO NTТут спочатку фіксується перший сегмент типу «викладач кафедри математики факультету

інформатики», а потім за допомогою команд GET NEXT, що виконуються в циклі, здійснюєтьсяпослідовне перебирання сегментів.

Наведені вище різновиди команди GET здійснюють пошук конкретного екземпляра сегмента вмежах усієї ієрархічної структури.Отже, операція в ієрархічній моделі програмує «навігацію» структурою даних.

Маніпулювання даними.Маніпулювання даними передбачає додавання, заміну та видалення екземплярів сегментівспецифікованих типів.

Додати новий екземпляр сегмента можна лише за умови, що в ієрархічній структурі вже єекземпляр його батьківського сегмента. У команді додавання INSERT задається повнийієрархічний шлях до цього батьківського сегмента, тип сегмента, що підлягає додаванню, тадані екземпляра сегмента, який додається. Наведемо приклад операції додавання нового екземпляра сегмента КАФЕДРА:

КАФЕДРА.Назва = "САПР";КАФЕДРА.Завідуючий = "Іванов";КАФЕДРА.Корпус = 3;INSERT КАФЕДРАWHERE ФАКУЛЬТЕТ.Назва = "інформатики”:Щоб замінити сегмент, його слід спочатку вибрати за допомогою команди GET HOLD, яка

вказує, що шуканий сегмент буде модифікований, потім змінити у знайденого сегмента певніполя й застосувати команду REPLACE. Наприклад, у такий спосіб можна змінити сегмент «адресавикладача Петрова з кафедри САПР»:

Вступ. Моделі даних 15

Page 16: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

GET HOLD UNIQUE ВИКЛАДАЧ WHERE ФАКУЛЬТЕТ.Назва = "Інформатики" AND КАФЕДРА.Назва ="САПР" AND ВИКЛАДАЧ.Ім’я = "Петров":

ВИКЛАДАЧ.Адреса = "вул. Теремківська 1/19";REPLACE;Видалення сегмента здійснюється за тією ж схемою, що й заміна: потрібно віднайти сегмент

за допомогою команди GET HOLD, потім видалити його командою DELETE. При цьому прикладнапрограма може проаналізувати значення полів знайденого сегмента і прийняти остаточнерішення щодо його подальшого існування.

Наприклад, видалення інформації про викладача Петрова кафедри САПР факультетуінформатики виконується так:

GET HOLD UNIQUE ВИКЛАДАЧ WHERE ФАКУЛЬТЕТ.Назва = "інформатики" AND КАФЕДРА.Назва =“САПР" AND ВИКЛАДАЧ.Ім’я - "Петров":

DELETE;Видалення екземпляра сегмента приводить до видалення всіх екземплярів його дочірніх

сегментів, оскільки в ієрархічній структурі жодний екземпляр сегмента не може існувати безсвого «батька». Отже, якщо ви видаляєте екземпляр сегмента КАФЕДРА, то автоматичновидаляються всі екземпляри сегментів, шо відповідають викладачам даної кафедри.

1.3.3. Обмеження цілісності.В ієрархічній моделі даних автоматично підтримується цілісність посилань між батьками танащадками. Основне правило: ніякий нащадок не може існувати без свого батька.

Відмітимо, що аналогічна підтримка цілісності за посиланням між записами без зв’язку«батько-нащадок», не забезпечується. Прикладом такого зовнішнього посилання є вміст поляПосада в екземплярі типу запису Викладач.

1.3.4. Переваги та недоліки ієрархічної моделі.До переваг ієрархічної моделі належать:

розвинені низькорівневі засоби керування даними в зовнішній пам’яті;можливість побудови ефективних прикладних систем;економне використання пам’яті.

Зазначимо, що ієрархічна модель має також певні недоліки, які описані нижче.Асиметрія пошуку за симетричними запитами. Програми пошуку викладачів за кафедрами та

кафедр за викладачами принципово відрізняються: в першому випадку структура ієрархіїзбігається зі структурою пошуку, а в другому – ні.

Залежність між пошуком та відповідністю ієрархічної структури наявним зв’язкам упредметній області. Якщо ієрархічна структура відповідає структурі зв’язків ПО, то записуватипошукові вирази набагато легше.

Низький рівень мови запитів і маніпулювання даними. Оскільки маємо справу з мовоюпрограмування процедурного типу, результатом однієї пошукової операції є один екземплярсегмента даних, або ж один екземпляр ієрархічного шляху до заданого екземпляра сегмента. Цевказує на низьку селективну потужність мови.

Аномалії додавання, видалення та оновлення даних. Не можна здійснити операцію додаваннясегмента ВИКЛАДАЧ без зазначення сегмента КАФЕДРА; не можна видалити сегмент КАФЕДРА,на видаляючи сегментів ВИКЛАДАЧ; після оновлення даних один і той самий екземпляр сутностізображується у вигляді багатьох екземплярів об’єктів бази даних.

Дублювання даних. Якщо об’єкти предметної області мають зв’язки типу «один-до-одного»або «один-до-багатьох», то ієрархічна структура дає змогу зображувати дані без дублювання;проте, якщо є зв’язки типу «багато-до-багатьох», то дублювання даних під час відображення вієрархічній моделі неминуче. Крім згаданих основних недоліків ієрархічної моделі слід зазначититакож складність реалізації гнучких механізмів захисту даних, цілісності та несуперечності й«дружніх» інтерфейсів користувача.

Основні недоліки ієрархічної моделі пов’язані з тим, що не всі предметні області мають чітковиражену ієрархічну структуру Наведений на рис. 1.4 приклад добре узгоджується з ієрархічноюструктурою. Проте, якщо ми розглянемо предметну область із сутностями «викладач»,«дисципліна», «лекція» в ситуації, коли один викладач читає лекції з багатьох дисциплін і однай та сама дисципліна читається багатьма викладачами, то вона «погано» піддається ієрархічнійструктуризації. Справа в тому, що між викладачами і дисциплінами існує зв’язок типу «багато-до-багатьох», який не є адекватним ієрархічній структурі даних (докладніше про це мова йтиме

Вступ. Моделі даних 16

Page 17: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

в розділах, присвячених логічному проектуванню).Для відображення зв’язків цього типу була запропонована мережева модель даних.

1.4 Мережева модель данихМережева модель даних є розширенням ієрархічної моделі й призначена для адекватногомоделювання зв’язків між сутностями типу «багато-до-багатьох».

Окрім формальної нотації для мережевої моделі (мова опису даних – МОД) та пов’язаних з неюпевних ключових концепцій, для мережевої моделі були запропоновані МОД підсхеми дляозначення зовнішнього відображення концептуальної схеми бази даних та мову описузбережених даних (МОЗД) для означення способів зберігання даних на носіях. Самаконцептуальна схема описується за допомогою МОД. Запропонована була й мова маніпулюванняданими (ММД) для написання прикладних програм, що взаємодіють з базою даних у термінахзовнішньої схеми (підсхеми).

1.4.1. Мережна структура даних.Мережева структура даних є сукупністю схеми та екземпляра схеми. У свою чергу мережевасхема формується з полів даних, типів записів і наборів, які також мають свої екземпляри.Власне з екземплярів полів, записів та наборів складається екземпляр схеми.

Елементарною одиницею даних мережної (так само, як ієрархічної) структури є пойменованеполе даних.

Тип запису – це пойменована впорядкована сукупність імен полів. Екземпляр запису (аналогсегмента в ієрархічній структурі даних) – це впорядкована сукупність значень полів запису.Екземпляр запису є одиницею доступу до даних мережної структури.

Набір – пойменований дворівневий ієрархічний зв’язок типів записів. Із дворівневих наборівможуть будуватися багаторівневі ієрархії та мережні структури. Кожний тип набору – цесукупність зв’язків між двома або кількома типами записів, де один тип запису оголошуєтьсявласником, а інший (або кілька інших) – членами типу набору. Екземпляр набору містить одинекземпляр запису-власника і довільну кількість екземплярів кожного типу запису-члена набору.Отже, набір описує дворівневий ієрархічний зв’язок типу «один-до-багатьох».

Тип запису СЕКЦІЯ (рис. 1.6, а) є власником типу набору, а типи ДИСЦИПЛІНА і ВИКЛАДАЧ –члени типу набору.

На рис. 1.6, б зображений екземпляр цього типу набору. Він містить один екземпляр типузапису КАФЕДРА і декілька типів записів ДИСЦИПЛІНА та ВИКЛАДАЧ.

а бРисунок 1.6 – Приклад опису набору «Секція»: а) тип набору, б) екземпляр наборуТипи наборів можуть використовуватися для створення багаторівневих ієрархічних або

мережевих структур. Для опису будь-якої п-рівневої ієрархії потрібно принаймні п-1 наборів.Один тип запису може мати кілька батьківських записів, якщо вони є власниками різних типівнаборів, тобто запис може бути членом багатьох наборів і мати декілька записів-власників. Такформуються мережеві структури.

Приклад схеми мережевої структури даних, що складається з п’яти типів наборів даних,наведений на рис. 1.7. Мережеву структуру формують набори Прослуховує, Читається і Читає, атип запису ЛЕКЦІЯ є їхнім членом.

Мережева структура може відображувати цикли та петлі. Циклом називається конфігурація,в якій предок типу запису є водночас його нащадком. Приклад циклічної мережевої структуринаведений на рис.1.8 а. Тут вироби одного заводу є сировиною для виробів іншого.

Петля – це структура, де один тип запису є водночас власником і членом в одному типінабору. Виріб складається з вузлів і деталей (рис. 1.8 б), в свою чергу вузли можуть складатисьіз інших вузлів і деталей. Тоді навколо типу запису утворюється петля.

Вступ. Моделі даних 17

Page 18: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Рисунок 1.7 – Мережева структура даних

а бРисунок 1.8 – Приклади мережевих структур даних: а) цикл; б) петля

1.4.2. Операції над мережевою структурою.Операції над мережевою структурою даних концептуально аналогічні до операцій надієрархічною структурою. Мова маніпулювання даними в мережній структурі також єнизькорівневою, тобто її використання передбачає програмування процесів «навігації»структурою. Кожний тип запису в цій моделі, на відміну від ієрархічної, може мати поточнийекземпляр запису, відносно якого можна організовувати подальше перебирання екземплярів,окрім того, кожний тип набору може мати поточний екземпляр набору.

Згідно з пропозиціями CODASYL, навігація структурою та вибирання даних виконуються в дваетапи. Спочатку за допомогою послідовності операторів FIND визначається розташуванняекземпляра запису необхідного типу, тобто бажаний запис стає поточним. Потім командою GETможна вибрати поточний запис, вказуючи (в разі потреби) його поля. Команда FIND насправді єсукупністю команд, об’єднаних спільною метою, – визначити місцезнаходження конкретногозапису за вказаною стратегією. Оператори FIND дають змогу:

знаходити запис за ключем або значеннями полів;послідовно переглядати записи вказаного типу, щоб знайти всі записи із заданимизначеннями полів;послідовно переглядати всі записи-члени екземпляра набору;переглядати записи-члени екземпляра набору, які мають специфіковані значення в певнихполях;знаходити власника даного запису в наборі.

Комерційні системи зазвичай підтримують мови, що дають можливість досить гнучкоздійснювати навігацію мережею. Покажемо стисло, як це робиться в мережевій СКДБ IDMS.Розглянемо оператори, що дають змогу встановити поточні записи, незалежно від зв’язків(наборів), у яких вони беруть участь. Усі наведені приклади використовують структуру,зображену на рис. 1.7. Оператор

FIND ім’я запису RECORD USING ідентифікаторвизначає пошук запису за значенням ключа бази даних. Тут ідентифікатор – змінна, що

містить значення ключа бази даних. Оператор FIND [NEXT DUPLICATE] ім’я запису RECORD [WHEREкваліфікація] керує пошуком запису за значенням його елементу.Розглянемо такий запит:

FIND ВИКЛАДАЧ RECORD WHERE Посада = "Професор"GET ВИКЛАДАЧ RECORDПочаток циклу, виконувати до стану "запис відсутній"FIND NEXT DUPLICATE ВИКЛАДАЧ RECORD GET ВИКЛАДАЧ RECORD Кінець циклуПід час його виконання здійснюється перегляд списку всіх професорів, незалежно від

членства запису ВИКЛАДАЧ у тому чи іншому наборі.

Вступ. Моделі даних 18

Page 19: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Наступні три навігаційні операції дають змогу встановлювати поточні записи з урахуваннямїхньої належності до будь-яких наборів Оператор

FIND {NEXT I PRIOR | FIRST I LAST | n} <ім’я запису> RECORD <ім’я набору> SETдає можливість специфікувати елемент набору, який вибирається.

Наприклад,командаFIND FIRST ВИКЛАДАЧ RECORD КАФЕДРА SETробить поточним перший запис типу ВИКЛАДАЧ, що належить до поточного екземпляра

набору КАФЕДРА.Команда

FIND OWNER RECORD <ім’я набору> SETзадає вибирання екземпляра запису-власника, що належить до екземпляра набору вказаного

типу. Ця команда, як й інші, застосовується до поточного екземпляра набору. Нарешті командаFIND <ім’я запису» RECORD VIA [CURRENT] <ім’я набору> SET WHERE <кваліфікація>забезпечує вибір запису за його членством у наборі й значенням елементу даних.Як і в ієрархічній моделі даних, мова маніпулювання мережевою структурою надає можливість

вставляти, модифікувати й видаляти екземпляри записів відповідних типів з урахуванням їхньоїналежності до тих чи інших наборів.

1.4.3. Переваги та недоліки мережної моделі.Для мережевої моделі даних властиві майже ті самі переваги та недоліки, що й для ієрархічноїмоделі. Принциповою відмінністю мережевої структури від ієрархічної є можливістьбезпосередньо відображувати складніші типи зв’язків. Натомість ієрархічні системи простіші вреалізації та експлуатації.

1.5 Постреляційна модель даних.

1.5.1. Постреляційна структура даних.Важливим аспектом традиційної реляційної моделі даних є той факт, що елементи даних, якізберігаються на перетині рядків і стовпців таблиці, повинні бути неподільні і єдині. Це значить,що дані не можуть бути розгорнуті в процесі подальшої обробки. Таке правило було закладено воснову реляційної алгебри при її розробці як математичної моделі даних. Подальші дослідженняпоказали, що існує ряд випадків, коли обмеження класичної реляційної моделі суттєвозаважають ефективній реалізації додатків.

В основі проблеми лежать три питання:

робота з полями змінної довжини й групами записів;керування відносинами між таблицями й полями;відбиття семантичного змісту реальних структур, які будуть змодельовані базою даних.

Основний принцип реляційної моделі – усувати повторювані поля й групи за допомогою процесу,який називається нормалізацією.

Досвід розробки прикладних інформаційних систем показав, що відмова від цієї установкиведе до якісно корисного розширення моделі даних. Якщо допустити, що значення даних можесаме складатися з підзначень, то в результаті виникає поняття багатозначного поля.Найпростіше розглядати набір багатозначних полів у таблиці як самостійну вкладену (nested)таблицю.

За умови, що вкладена таблиця задовольняє загальним критеріям (наприклад має унікальнийключ), природно відбувається розширення операторів реляційної алгебри. Така модель данихбула названа постреляційною.

Багато методологій проектування даних дозволяють визначати багатозначні поля й потімвидаляти в процесі нормалізації. При цьому таблиці перетворяться в першу нормальну формуабо 1NF. Однак видалення багатозначних полів не завжди сприяє поліпшенню прикладнихпрограм. У випадках, коли звичайна форма доступу до поля має на увазі звернення до всіх йогозначень, базі даних з таблицями в 1NF прийдеться проробити операцію з’єднання (Join) щоразу,коли потрібно одержати відповідні значення, що зберігаються в іншій таблиці. Зовсім очевидно,що в подібній ситуації зберігання значень фізично в багатозначних полях може забезпечитибільш ефективний доступ до інформації.

Вступ. Моделі даних 19

Page 20: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

На рис.1.9 наочно продемонстровані переваги зберігання даних у базах uniVerse, щовідносяться до непершої нормальної форми, перед більш громіздким зберіганням у базах данихпершої нормальної форми. Приклад представляє зберігання частини даних такого типовогодокумента, як накладна.

а – Подання даних у 1NF та подальша нормалізація (2NF)

б – Структура збереження даних в uniVerse NFNF (NF2)Рисунок 1.9 – Структури збереження даних з багатозначними полями в uniVerseі в традиційних

системах.Тоді як в uniVerse можна створювати багатозначні поля змінної довжини, всі замовлення

можуть зберігатись в одній таблиці. При цьому для зберігання необхідно менше місця та приобробці не вимагається об’єднувати дані, що підвищує ефективність збереження даних.

Про таблиці, що містять багатозначні поля, говорять, що вони перебувають у непершійнормальній формі, або NF2 (Non First Normal Form). Як було помічене раніше, за умови, щовикористовувані поля підкоряються певним правилам, що дозволяють звертатися до них, як дотаблиці, вбудовані в інші таблиці, форма NF2 не порушує принципи реляційної алгебри. Більшетого, така інформація повністю доступна, тому що розширені оператори, які працюють ізтаблицями NF2, дозволяють витягати вбудовані таблиці й розглядати дані як інформацію, щозробила з таблиць 1NF. І все-таки в багатьох випадках форма 1NF буде скоріше виключенням, ане правилом. У більшості випадків набагато більш ефективно здійснювати доступ добагатозначних полів одночасно з іншими даними, знаючи, що їх завжди можна витягати йрозглядати як окрему таблицю в тих випадках, коли це може знадобитися.

Модель даних СУБД uniVerse фірми Ardent підтримує асоційовані багатозначні поля, які частоназивають множинними групами. Тобто ви можете зв’язати кілька стовпців із множиннимизначеннями в єдине ціле, яке називається асоціацією. При цьому в рядку перше значення одногостовпця асоціації відповідає першим значенням усіх інших стовпців асоціації, у такому ж зв’язкуперебувають усі другі значення стовпців і т.д.

1.5.2. Операції над даними.Багатозначні поля й асоціації не можуть вкладатися друг у друга. Розширення синтаксису SQLдозволяє здійснювати доступ до множинних полів як розширення реляційної моделі, але,звичайно, можна застосовувати також стандартні й інша мова запитів uniVerse – Retrieve. Уцілому багатозначність полів є дуже корисною властивістю при створенні комерційних додатків,де інформація нерідко представлена у вигляді списків предметів.

Вступ. Моделі даних 20

Page 21: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Для доведення на рис. 1.10 приводяться приклади використання оператора Select для вибіркиданих з реляційних і постреляційних таблиць.

а) SELECTINVOICES.INVNO, CUSTNO, GOODS, QTY FROMINVOICES, INVOICE. ITEMS WHEREINVOICES.INVNO= INVOICES.ITEMS.INVNO;б) SELECT INVNO, CUSTNO, GOODS, QTYFROMINVOICES;Рисунок 1.10 – Оператори SQL для реляційної и постреляційної моделей

Модель даних uniVerse являє собою розширену форму реляційної моделі даних, яка допускаєвикористання даних у формі NF2. У цій моделі всі дані зберігаються у формі таблиць, як і узвичайній реляційній базі даних. Єдина відмінність полягає в тому, що таблиці NF2 можутьмістити вкладені таблиці.

Як і в більшості реляційних баз даних, таблиці описані в словниках, що містять логічні описи,які представляють стовпці таблиць. Можна сказати, що реляційні й постреляційні СУБДрізняться тільки способами зберігання й індексування даних, у всім іншому – це те саме.

Звичайно компанії автоматично вибирають реляційну модель, не даючи собі праці пошукатибільш продуктивний спосіб обробки даних. Як тільки вони починають аналізувати свої проблеми,з’ясовується, що ефективність постреляційної технології в керуванні більшими масивами швидкомінливої інформації, наприклад у бізнес-додатках, набагато вище.

Крім того, uniVerse не вимагає, щоб дані в поле були певної довжини або щоб кількість полів узаписі було фіксовано. Це означає, що всі дані й таблиці відрізняє більша гнучкість щодо розміруі їх можна легко видозмінювати.

1.5.3. Структура вкладених таблиць.Використання вкладених таблиць повністю відбиває основне завдання реляційної моделі –забезпечення користувача простою логічною структурою даних. Фактично, вкладені таблиці щебільш спрощують логічне подання даних і є природнім розширенням реляційної моделі.Розширення реляційної бази даних пропоноване фірмою Ardent дозволяє використовувативкладені таблиці як атрибути із множинними значеннями й зв’язані групи таких атрибутів.Для створення таблиці може бути використане наступне SQL речення:

CREATE TABLE ORDER(INNUM INT NOT NULL PRIMARY KEY,CUSTNUM INT,GOODS CHAR(25) MULTIVALUED NOT NULL,AMNT INT MULTIVALUED,ASSOC PHONES (GOODS, AMNT)); У цьому випадку атрибути із множинними значеннями визначаються словом MULTIVALUED, а

зв’язані групи – словом ASSOC. Звичайно, якщо необхідне подання даних у першій нормальнійформі, Ardent надає механізм для динамічної нормалізації даних (у процесі запитів). Для даноїмети в SQL синтаксис розширений ключовим словом UNNEST.

1.5.4. Структура вкладених реляційних відношень.Як описано вище, визначення відношень пов’язане з необхідністю підтримки цілісності даних. Увипадку використання вкладених таблиць, визначення відношень стають більш неявним ніжявним і обмеження цілісності в них здійснюються автоматично, без додаткових визначень.Дійсно, у даній моделі немає необхідності зберігати зовнішні ключі у вкладеній і в основнійтаблиці оскільки фактично одна таблиця є частиною іншої й при вибірці записів з основноїтаблиці, автоматично вибираються дані із вкладеної.

Так само відбувається й з посилальними обмеженнями цілісності – при видаленні записуосновної таблиці, природно, віддаляються всі вкладені в цей запис таблиці. Крім тогоз’являється цілий ряд додаткових переваг. Так можливість зберігати у вкладеній таблиці безлічзовнішніх ключів рятує від необхідності використовувати й підтримувати таблиці перехреснихпосилань у відносинах безліч до безлічі, що дає незаперечні переваги на вибірках з більшихмасивів даних.

Вступ. Моделі даних 21

Page 22: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

1.5.5. Переваги та недоліки постреляційної моделі даних.Перевагою постреляційної моделі є можливість представлення сукупності зв’язаних реляційнихтаблиць однією постреляційною таблицею. Це забезпечує високу наочність представленняінформації й підвищення ефективності її обробки.

Недоліком постреляційної моделі є складність вирішення проблеми забезпечення цілісності йнесуперечності збережених даних.

1.6 Об’єктно-орієнтована модель даних

1.6.1. Структура моделі даних.Об’єктно-орієнтована модель даних враховує семантику об’єктів, яка застосовується воб’єктно-орієнтованому програмуванні. Основними модельними поняттями є об’єкти і літерали.

Об’єкт має унікальний ідентифікатор, який не змінюється і не використовується післявидалення об’єкта. Об’єкти можуть бути розбиті на типи: атомарні, колекції або структурованітипи. Тип також є об’єктом. Об’єкт інкапсулює стан і поведінку. Поведінку об’єкта – це операції,які можуть бути виконані або самим об’єктом, або над ним. У сукупності ці операції називаютьсяметодами. Стан об’єкта визначається значеннями, які маються у набору властивостей об’єкта.Є два типи властивостей – атрибути та зв’язки. Атрибут визначається для об’єктів одноготипу. Він не є об’єктом, але може приймати в якості значень літерал або ідентифікатор об’єкта.Об’єкт може зберігати всі зв’язки, якими він пов’язаний з іншими об’єктами, включаючи зв’язок«багато – до – багатьох». Зв’язки представлені за допомогою посилальних атрибутів. Запитодного об’єкта до іншого називають повідомленням.

Об’єкти, що мають однакові атрибути і відповідають на одні й ті ж повідомлення, утворюютьклас. Спадкування дозволяє визначити один клас як окремий випадок більш загального класу.Поліморфізм означає допустимість в об’єктах різних типів мати методи з однаковими іменами.

Типи літералів можна розбити на атомарні, колекції, структуровані типи та об’єкти без типу.Літерали не можуть існувати окремо. Вони завжди вбудовані в об’єкт. За допомогою механізмунаслідування допускається створення нових абстрактних типів даних на основі вже існуючих.

Логічно структура об’єктно-орієнтованої бази даних схожа на структуру ієрархічної базиданих (рис. 1.11). Основна відмінність полягає в методах маніпулювання даними.

Рисунок 1.11 - Об'єктно-орієнтована схема даних

1.6.2. Операції маніпулювання даними.В стандарті ODMG в якості базового засобу маніпулювання об’єктними базами данихпропонується мова OQL (Object Query Language). Це невелика, але досить складна мова запитів.Розробники в цілому характеризують її таким чином:

OQL спирається на об’єктну модель ODMG (мається на увазі, що в ній підтримуютьсязасоби доступу до всіх можливих структур даних, що допускаються в структурній частині

Вступ. Моделі даних 22

Page 23: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

моделі).OQL дуже близька до SQL/92. Розширення відносяться до об’єктно-орієнтованих понять,таких як складні об’єкти, об’єктні ідентифікатори, шляхові вирази, поліморфізм, викликоперацій і відкладене зв’язування.У OQL забезпечуються високорівневі примітиви для роботи з множинами об’єктів, але, крімтого, є настільки ж ефективні примітиви для роботи зі структурами, списками і масивами.OQL є функціональним мовою, що допускає необмежену композицію операцій, якщооперанди не виходять за межі системи типів. Це є наслідком того факту, що результатбудь-якого запиту володіє типом, що належить до моделі типів ODMG, і тому дорезультату запиту може бути застосований новий запит.OQL не є обчислювально повною мовою. Вона являє собою просту мову запитів.Оператори мови OQL можуть викликатися з будь-якої мови програмування, для якого встандарті ODMG визначені правила зв’язування. І, навпаки, у запитах OQL можуть бутиприсутніми виклики операцій, запрограмованих на цих мовах.У OQL не визначаються явні операції оновлення, а використовуються виклики операцій,визначених в об’єктах для цілей оновлення.У OQL забезпечується декларативний доступ до об’єктів. З цієї причини OQL-запитиможуть добре оптимізуватися.Можна легко визначити формальну семантику OQL.

В рамках цієї теми обмежимося лише одним характерним прикладом виконання запиту наотримання номерів керівників відділів і тих службовців їх відділів, зарплата яких перевищує 2000грн.

SELECT DISTINCT STRUCT (ВДЛ_РУК: D.ВДЛ_РУК, СЛУ:(SELECT EFROM D.CONSISTS_OF AS EWHERE E.СЛУ_ЗАРП> 20000.00))FROM ВІДДІЛИ D Тут передбачається, що для атомарного об’єктного типу ВІДДІЛ визначений екстент типу

безлічі з ім’ям ВІДДІЛИ. У запиті перебираються всі існуючі об’єкти типу ВІДДІЛ, і для кожноготакого об’єкта відбувається перехід по зв’язку до літеральної безлічі об’єктів типуСЛУЖБОВЕЦЬ, відповідних службовцям, які працюють в даному відділі. На основі цієї безлічіформується «усічена» безліч об’єктів типу СЛУЖБОВЕЦЬ, в якій залишаються тільки об’єкти-службовці із зарплатнею, більшою від 2000.00 грн. Результатом запиту є літеральне значення-безліч, елементами якого є значення-структури з двома літеральними значеннями, перше з якихє атомарне літеральне значення типу INTEGER, а друге – літеральне значення-множина зелементами-об’єктами типу СЛУЖБОВЕЦЬ.

Більш точно, результат запиту має тип set < struct {integer ВДЛ_РУК; bag <СЛУЖБОВЕЦЬ>СЛУ}>.У сукупності результатом допустимих в OQL виразів запитів можуть бути:

колекція об’єктів;індивідуальний об’єкт;колекція літеральних значень;індивідуальне литеральное значення.

1.6.3. Обмеження цілісності в об’єктній моделі.Відповідно до загальної ідеології об’єктно-орієнтованого підходу в моделі ODMG два об’єктивважаються співпадаючими в тому і т ільки в тому випадку, коли є одним і тим же об’єктом,тобто мають один і той же OID. Об’єкти одного об’єктного типу з різними OID вважаютьсярізними, навіть якщо володіють повністю співпадаючими станами. Тому в об’єктній моделівідсутній аналог обмеження цілісності суті реляційної моделі даних. Цікаво, що при визначенніатомарного об’єктного типу можна оголосити ключ – набір властивостей об’єктного класу,однозначно ідентифікує стан кожного об’єкта, що входить в екстент цього класу. Для класуможе бути оголошено кілька ключів, а може не бути оголошено жодного ключа навіть занаявності визначення екстента. Але при цьому визначення ключа не трактується в моделі якобмеження цілісності; стверджується, що оголошення ключа сприяє підвищенню ефективностівиконання запитів.

Вступ. Моделі даних 23

Page 24: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Що ж стосується посилальної цілісності, то вона підтримується, якщо між двома атомарнимиоб’єктними типами визначається зв’язок виду «один-до-багатьох». У цьому випадку об’єкти настороні зв’язку «один» розглядаються як предки, а об’єкти на стороні зв’язку «багато» – якнащадки, і ООСУБД зобов’язана стежити за тим, щоб не утворювалися нащадки без предків.

1.6.4. Переваги та недоліки об’єктно-орієнтованої моделі даних.Перевагами об’єктно-орієнтованої моделі є покращення можливості моделювання об’єктівреального світу. Об’єктні типи даних, а також об’єктні таблиці представляють потужнийєдиний рівень інтерпретації об’єктів ділової сфери і дозволяють відмовитися від поділу начастини бізнес-даних для зберігання їх в БД при використанні реляційної моделі.

Недоліками моделі є висока понятійна складність, відсутність стандарту об’єктно-орієнтованої моделі через недостатню її теоретичну розробку.

1.7 Об’єктно-реляційна модель даних.

1.7.1. Структура моделі даних.У зв’язку з недостатньою розробленістю об’єктно-орієнтованої моделі на практицізастосовується об’єктно-реляційна модель, що є ніби сумішшю реляційної та об’єктно-орієнтованої методологій для представлення даних. Ця модель являє собою розширенуреляційну модель, в якій зняті обмеження неподільності даних, які зберігаються в записахтаблиць.

Допускаються багатозначні поля – поля, значеннями яких є самостійні таблиці, вбудовані восновну таблицю. Крім цього підтримуються такі концепції об’єктно-орієнтованогопрограмування, як «абстракція», «клас», «екземпляр», «інкапсуляція», «метод»,«перевантаження» і «повідомлення».

Хоча спадкування і є однією з найбільш важливих характеристик об’єктів, але в об’єктно-реляційній моделі воно не підтримується.

В модель вводиться спеціальний об’єктний тип, за допомогою якого можна створитиабстрактний тип даних будь-якого ступеня складності.

Використовуючи вкладені об’єктні типи, можна створювати структури, в якихвикористовуються всі види зв’язків: «один до одного», «один до багатьох» і навіть «багато добагатьох». Хоча це і може призвести до певної надмірності, такий підхід дає переваги впорівнянні з використанням безлічі нормалізованих таблиць в чисто реляційній моделі.

1.7.2. Переваги та недоліки об’єктно-реляційної моделі даних.Перевагою об’єктно-реляційної моделі є можливість використання існуючих реляційних базданих з знову розроблюваними об’єктними додатками.

До недоліків моделі можна віднести складність вирішення проблеми забезпечення цілісності інесуперечності збережених даних.

1.8 Багатовимірна модель даних

1.8.1. Багатовимірна структура даних.Багатовимірна модель даних є вузькоспеціалізованою моделлю, яка призначена дляоперативної аналітичної обробки інформації. В основі моделі лежить не двомірна, як в реляційніймоделі, а багатовимірна таблиця і багатовимірне логічне представлення структури інформаціїпри описі даних і в операціях маніпулювання даними. У порівнянні з реляційною моделлюбагатовимірна організація даних має більш високу наочність та інформативність.

За визначенням, запропонованим Б. Коддом, багатовимірне концептуальне представлення(multi-dimensional conceptual view) – це множинна перспектива, що складається з кількохнезалежних вимірювань, уздовж яких можуть бути проаналізовані визначені сукупності даних.Одночасний аналіз за кількома вимірюваннями визначається як багатовимірний аналіз.

Вступ. Моделі даних 24

Page 25: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

On-Line Analytical Processing (OLAP) – технологія оперативної аналітичної обробки даних, щовикористовує методи і засоби для збору, зберігання та аналізу багатовимірних даних з метоюпідтримки процесів прийняття рішень.

Є 12 правил, що визначають OLAP, згідно із концепцією Б. Кодда.

1. Багатовимірність – OLAP-система на концептуальному рівні має представляти дані увигляді багатовимірної моделі, що спрощує процеси аналізу і сприйняття інформації.

2. Прозорість – це спосіб організації даних, джерела, засоби обробки і зберігання.3. Доступність – OLAP-система має надавати користувачу єдину, узгоджену і цілісну модель

даних, забезпечуючи доступ до даних незалежно від того, як і де вони зберігаються.4. Постійна продуктивність при розробленні звітів – продуктивність OLAP-систем не має

дуже зменшуватися при збільшені кількості вимірювань, за якими виконується аналіз.5. Клієнт-серверна архітектура – OLAP-система має бути здатна функціонувати у клієнт-

серверному середовищі, оскільки більшість даних, які потрібно обробляти, зберігаєтьсядецентралізовано. Серверний компонент інструменту OLAP має бути достатньоінтелектуальним і дозволяти будувати загальну концептуальну схему на основіузагальнення й консолідації різних логічних і фізичних схем корпоративних БД длязабезпечення ефекту прозорості.

6. Рівноправність вимірювань – OLAP-система має підтримувати багатовимірну модель, в якійусі вимірювання рівноправні. За необхідності додаткові характеристики можуть бутинадані окремим вимірюванням, але така можливість має бути надана будь-якомувимірюванню.

7. Динамічне управління розрідженими матрицями – OLAP-система має забезпечуватиоптимальну обробку розріджених матриць. Швидкість доступу повинна зберігатисянезалежно від розташування осередків даних і бути постійною величиною для моделей,що мають різну кількість вимірювань і різний ступінь розрідженості даних.

8. Підтримка розподіленого режиму доступу – OLAP-система має надавати можливістьпрацювати кільком користувачам спільно з однією аналітичною моделлю або створюватидля них різні моделі з єдиних даних. При цьому можливі усі операції.

9. Підтримка перехресних операцій – OLAP-система мас забезпечувати збереженняфункціональних відношень, описаних за допомогою певної формальної мови міжосередками гіперкуба при виконанні будь-яких операцій зрізу, обертання, консолідації абодеталізації. Система має автоматично виконувати перетворення встановлених відношень,не вимагаючи від користувача їх перевизначення.

10. Інтуїтивна маніпуляція даними – OLAP-система має надавати спосіб виконання операційзрізу, обертання, консолідації і деталізації над гіперкубом без необхідності длякористувачів здійснювати дії з інтерфейсом. Вимірювання, визначені в аналітичній моделі,мають містити всю необхідну інформацію для виконання операцій.

11. Гнучкі можливості отримання звітів – OLAP-система має підтримувати різні способивізуалізації даних, тобто звіти мають подаватися у будь-якому можливому вигляді.

12. Необмежена розмірність і кількість рівнів агрегації – одночасно може використовуватисяблизько 20 вимірювань.

Основні поняття багатовимірної СУБД: агрегація, історичність і прогнозованість даних.

Агрегація даних означає розгляд інформації на різних рівнях її узагальнення. Вінформаційних системах ступінь детальності подання інформації для користувачазалежить від його рівня: аналітик, користувач-оператор, керуючий, керівник.Історичність даних передбачає забезпечення високого рівня статичності (незмінності)власне даних і їх взаємозв’язків, а також обов’язковість прив’язки даних до часу.Прогнозованість даних передбачає завдання функцій прогнозування і застосування їх дорізних часових інтервалів.

Багатовимірна модель даних – це перш за все багатовимірне логічне подання даних при їх описі іопераціях маніпулювання даними, а не багатовимірність їх візуалізації. В порівнянні з реляційноюмоделлю багатовимірна організація даних володіє більш високою інформативністю (рис. 1.12).

Вступ. Моделі даних 25

Page 26: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

а) реляційне подання даних

б) багатовимірне подання даних

в) тривимірна модель данихРисунок 1.12 – Реляційне та багатовимірне подання данихДо числа основних понять багатовимірної моделі відносяться вимір і комірка. Вимір – це безліч

однотипних даних, що утворюють одну з граней багатовимірної таблиці (аналог домену вреляційній моделі). Наприклад, дні, місяці, квартали, роки – це часові виміри, які найчастішевикористовуються в аналізі. Прикладами географічних вимірів є міста, райони, регіони і т. ін.

У багатовимірній моделі даних виміри відіграють роль індексів, які використовуються дляідентифікації конкретних значень (показників), що знаходяться в комірках гіперкуба.

Комірка – це поле, значення якого однозначно визначається фіксованим набором вимірів. Убагатовимірній СУБД Oracle Express Server показник може бути визначений, як:

змінна (Variable) – значення таких показників один раз вводяться з будь-якого зовнішньогоджерела або формуються програмно, а потім у явному вигляді зберігаються в

Вступ. Моделі даних 26

Page 27: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

багатовимірній базі даних;формула (Formula) – значення таких показників обчислюються за деякою заздалегідьспецифікованою формулою. Тобто для показника, який має тип «формула», у БДзберігається не його значення, а формула, за якою це значення може бути обчислено.

Використовуються два основних варіанти організації даних: гіперкубічна і полікубічна.У гіперкубічній схемі передбачається, що всі багатовимірні таблиці мають однакову

розмірність і співпадаючі виміри.У полікубічній схемі може бути визначено декілька таблиць з різною розмірністю і різними

вимірами. Системи, які підтримують полікубічну модель (прикладом є Oracle Express Server),припускають наявність у багатовимірній БД декількох гіперкубів з різною розмірністю та різнимивимірами.

Наприклад, значення показника «Робочий час менеджера» не залежить від виміру «Модельавтомобіля» та однозначно визначається двома вимірами: «Час» та «Менеджер».

У полікубічній моделі в цьому випадку можуть бути присутні два різні гіперкуби:

двовимірний (рис. 1.13) – для показника «Робочий час менеджера» з вимірами «Час»,«Менеджер»;тривимірний (рис. 1.14) – для показника «Обсяг продажів» з вимірами «Час», «Менеджер»,«Модель автомобіля».

У разі гіперкубічної моделі передбачається, що всі показники повинні визначатися одним і тимже набором вимірів. Тобто тільки через те, що «Обсяг продажів» визначається трьома вимірами,при описі показника «Робочий час менеджера» доведеться перебудувати модель і використатище один вимір –«Модель комп’ютера».

Рисунок 1.13 - Приклад гіперкубічної моделі

Вступ. Моделі даних 27

Page 28: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Рисунок 1.14 - Приклад полікубічної моделі

1.8.2. Операції над багатовимірною структурою даних. Багатовимірна модель застосовує ряд спеціальних операцій, до яких відносяться: формування«зрізу», «обертання», агрегація і деталізація.

Операція зріз (slice) являє собою підмножину гіперкуба, отриману в результаті фіксаціїодного або декількох вимірів. Формування «зрізів» виконується для обмеженнявикористовуваних користувачем значень, так як всі значення гіперкуба практично ніколиодночасно не використовуються (рис. 1.15).Операція обертання (rotate) застосовується при двовимірному поданні даних. Суть їїполягає в зміні порядку вимірів при візуальному представленні даних (рис. 1.16).

Рисунок 1.15 - Ілюстрація до операції зрізу

Рисунок 1.16 - Ілюстрація до операції обертанняЦя операція забезпечує можливість візуалізації даних у формі, найбільш

комфортної для їх сприйняття. Наприклад, аналітик має можливість вивестизвіт, в якому моделі автомобілів перераховані по осі X, а менеджери по осі V, іпоміняти місцями координати (виконавши обертання на 90 градусів).Використання ієрархічних відношень (Hierarchical Relationship).

Безліч відносин може мати ієрархічну структуру, яка відображує залежність вимірювань одинвід одного.Наприклад:

День → Місяць → Квартал → Рік;

Вступ. Моделі даних 28

Page 29: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Менеджер → Підрозділ → Регіон → Фірма → Країна;Модель автомобіля → Завод-виробник → Країна.

Часто зручніше не оголошувати нові виміри і потім встановлювати між ними множину відношень,а використовувати механізм ієрархічних відношень. У цьому випадку всі потенційно можливізначення з різних вимірів об’єднуються в одну множину.

Операція агрегації (Drill Up) – це операція підйому за рівнями консолідації даних у процесіаналізу або переходу від деталізованих даних до агрегованих (рис. 1.17). З точки зорукористувача, «Підрозділ», «Регіон», «Фірма», «Країна» є точно такими ж вимірами, як і«Менеджер». Але кожний з них відповідає новому, більш високому рівню агрегації значеньпоказника «Обсяг продажів».

Наприклад, подивившись, наскільки успішно в 2002 р. Сидоров продавав моделі BMV та Opel,керуючий може захотіти дізнатися, як виглядає співвідношення продажу цих моделей на рівніпідрозділу, де Сидоров працює. А потім отримати аналогічну довідку по регіону або фірмі.

Операція деталізації (Drill Down) – операція спуску за рівнями консолідації даних абопереходу від агрегованих до деталізованих даних (рис. 1.18). Наприклад, почавши аналізна рівні регіону, користувач має можливість отримати більш точну інформацію про роботуконкретного підрозділу або менеджера.

Рисунок 1.17 - Ілюстрація до операції агрегації

Рисунок 1.18 - Ілюстрація до операції деталізації

1.8.3. Переваги та недоліки багатовимірної моделі даних.Основною перевагою багатовимірної моделі даних є зручність і ефективність аналітичноїобробки великих обсягів даних, пов’язаних з часом. При організації обробки аналогічних даних наоснові реляційної моделі відбувається нелінійний зростання трудомісткості операцій залежновід розмірності БД та суттєве збільшення витрат оперативної пам’яті на індексацію.

Недоліком багатовимірної моделі даних є її громіздкість для найпростіших завдань звичайноїоперативної обробки інформації.

1.8.4. Сфери використання.Багатовимірні моделі даних мають три важливі області застосування, пов’язаних зпроблематикою аналізу даних:

1. Сховища даних інтегрують для аналізу інформації з декількох джерел.2. Системи оперативної аналітичної обробки дозволяють оперативно отримати відповіді на

запити, що охоплюють великі обсяги даних у пошуках загальних тенденцій.3. Додатки видобутку даних служать для виявлення знань за рахунок напівавтоматичного

пошуку раніше невідомих шаблонів і зв’язків у базах даних.

Вступ. Моделі даних 29

Page 30: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Багатовимірні СУБД є вузькоспеціалізованими СУБД, призначеними для інтерактивноїаналітичної обробки інформації.

З іншого боку, є істотні обмеження на використання БСУБД:

1. БСУБД не дозволяють працювати з великими базами даних. На сьогоднішній день їхреальна межа – 10-20 гігабайт.

2. БСУБД порівняно з реляційними малоефективно використовують зовнішню пам’ять.Комірки гіперкуба зберігаються в них у вигляді логічно впорядкованих масивів (блоківфіксованої довжини), причому саме такий блок є мінімальною одиницею, яка індексується.Хоч у багатовимірних СУБД блоки, які не містять жодного певного значення, незберігаються, це вирішує проблему тільки частково. Оскільки дані зберігаються увпорядкованому вигляді, невизначені значення не завжди віддаляються повністю, а лишев тому випадку, коли за рахунок вибору порядку сортування дані вдається організувати вмаксимально великі безперервні групи. Але порядок сортування, який частіше за всевикористовується в запитах, може не співпадати з порядком, в якому вони повинні бутивідсортовані, а бути сформований з метою максимального усунення неіснуючих значень.Таким чином, при проектуванні багатовимірної БД часто доводиться жертвувати абошвидкодією (а це одна з перших переваг та головна причина вибору саме багатовимірноїСУБД), або зовнішньою пам’яттю.

3. Для багатовимірних СУБД поки відсутні єдині стандарти на інтерфейс, мови опису таманіпулювання даними.

4. Багатовимірні СУБД не підтримують реплікацію даних, яка часто використовується якмеханізм завантаження даних.

Використання БСУБД виправдане тільки при умовах, коли:

1. Рівень агрегації даних досить високий. При цьому об’єм початкових даних для аналізу недуже великий (не більше кількох гігабайт).

2. Набір інформаційних вимірів стабільний (оскільки будь-яка зміна в їх структурі майжезавжди вимагає повної перебудови гіперкуба).

ВисновкиМодель даних визначає правила, за якими структуруються дані. Можна визначити три основнікомпоненти в моделі даних:

Структуризація даних – сукупність засобів визначення допустимих структур даних.Визначається різноманітністю та кількістю типів об’єктів моделі даних, обмеженнями наструктуру даних.Множина операцій, яку можна застосовувати до допустимого стану бази даних дляпошуку чи модифікації даних.Множина обмежень цілісності даних, яка в явному чи неявному вигляді визначає множинудопустимих станів бази даних.

Вибір моделі даних залежить від певної множини факторів, до яких слід віднести:

обсяг інформації,складність задач, що мають бути вирішені,наявне технічне та програмне забезпечення,засоби маніпулювання даними,цілісність та захист даних,критерії якості (надійність, точність, т.п.),можливість розвитку тощо.

Необхідно також пам’ятати, що вибір моделі даних визначає, зазвичай, вибір СУБД.

Модель даних SQL 30

Page 31: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Модель даних SQL

Тема 2 Введення в модель даних SQL 12Im Section 21.1 Типи і структури даних SQL

1.1.1. Tочні числові типи.Істинно цілі типиТочні типи, що допускають наявність дробової частини

1.1.2. Наближені числові типи.1.1.3. Типи символьних рядків.1.1.4. Типи бітових рядків.1.1.5. Типи дати і часу.1.1.6. Типи тимчасових інтервалів.1.1.7. Булевський тип.1.1.8. Типи колекцій.

Типи масивівТипи мультимножин.

1.1.9. Анонімні рядкові типи.1.1.10. Типи, визначені користувачем.

Структурні типи (Structured Types).Індивідуальні типи (Distinct Types).

1.1.11. Посилальні типи.1.2 Засоби визначення, зміни визначення та відміни доменів

1.2.1. Визначення домену.1.2.2. Зміна визначення домену.1.2.3. Ліквідація домену.

1.3 Засоби визначення базових таблиць та обмежень цілісності1.3.1. Засоби визначення базових таблиць.

Визначення базової таблиціВизначення стовпцяЗначення стовпця за замовчуваннямОбмеження цілісності стовпця

1.3.2. Визначення табличного обмеження.Табличне обмеження первинного або можливого ключаТабличне обмеження зовнішнього ключа

1.3.3. Підтримка посилальної цілісності і посилальні дії.1.3.4. Приклади визначення таблиць.1.3.5. Зміна визначення базової таблиці.

Додавання, зміна або видалення визначення стовпцяЗміна набору табличних обмежень.

1.3.6. Видалення базової таблиці.1.4 Засоби визначення та скасування загальних обмежень цілісності

1.4.1. Визначення загальних обмежень цілісності.1.4.2. Видалення загального обмеження цілісності.1.4.3. Негайна і відкладена перевірка обмежень.

Висновки

ТЕМА 2 ВВЕДЕННЯ В МОДЕЛЬ ДАНИХ SQL 12IM SECTION 2

1.1 Типи і структури даних SQLСеред усіх конструкцій мови SQL можна виділити такі конструкції, які можна було бвикористовувати при «прямій» (direct) взаємодії кінцевого користувача із СУБД (наприклад, вінтерактивному режимі). У деякому змісті цей рівень є базовим, оскільки відповідні засоби мовинайбільшою мірою відбивають його орієнтованість на роботу з множинами. На наступному рівні,рівні «вбудованому» (embedded) SQL, мова розширюється конструкціями, що дозволяють

Модель даних SQL 31

Page 32: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

використовувати можливості прямого SQL у програмах, написаних на традиційних мовахпрограмування. Нарешті, на рівні «динамічного» (dynamic) SQL до вбудованого SQL додаютьсяконструкції, що дозволяють додаткам звертатися до СУБД із конструкціями прямого SQL, якідинамічно утворюються під час виконання програми.

Рисунок 2.1 – Класифікація SQLSQL-орієнтована база даних являє собою набір таблиць, кожна з яких у будь-який момент

часу містить деяку мультимножину рядків, відповідних до заголовка таблиці. У цьому полягаєперша й найбільш важлива відмінність моделі даних SQL від реляційної моделі даних. Другоюістотною відмінністю є те, що для таблиці порядок стовпців, відповідний порядку їх визначення.Інакше кажучи, таблиця – це зовсім не відношення, хоча багато в чому вони схожі.

Є два основні різновиди таблиць, збережених у базі даних: традиційна таблиця й типізованатаблиця. Традиційна таблиця визначається як безліч стовпців із зазначеними типами даних. ВSQL підтримуються наступні категорії типів даних: точні числові типи; наближені числові типи;типи символьних рядків; типи бітових рядків; типи дати й часу; типи тимчасових інтервалів;булевський тип; типи колекцій; анонімні рядкові типи; типи, обумовлені користувачем;посилальні типи.

У стовпцях таблиць, визначених на будь-яких типах даних, поряд зі значеннями цих типів,допускається збереження невизначеного значення, яке позначається ключовим словомNULL.Тип

1.1.1. Tочні числові типи.До категорії точних числових типів в SQL відносяться ті типи, значення яких точнопредставляють числа. Типи даних цієї категорії розпадаються на дві частини істинно цілі типи(INTEGER і SMALLINT) і типи, що допускають наявність дробової частини (NUMERIC і DECIMAL).Охарактеризуємо ці типи даних більш докладно.

Істинно цілі типиТип INTEGER. Тип служить для подання цілих чисел. Точність чисел (число, що зберігаються біт)визначається в реалізації. При визначенні стовпця даного типу досить указати просто INTEGER.

Тип SMALLINT. Тип також служить для подання цілих чисел. Точність визначається вреалізації, але вона не повинна бути більше точності типу INTEGER. При визначенні стовпцявказується просто SMALLINT.

Літерали типів цілих чисел представляються у вигляді рядків символів, що зображуютьдесяткові числа; на початку рядка можуть бути присутнім символи «+» або «-» (якщо символзнаку відсутній, мається на увазі «+»). Приклади літералів типів INTEGER и SMALLINT: 1826545,876.

Точні типи, що допускають наявність дробової частиниТип NUMERIC. Насправді, це не просто тип даних, а параметризуємий тип. При визначенністовпця можна вказати специфікацію NUMERIC (p, s), де p и s – літерали істино цілого типу, pзадає точність значень (число зберігаємих біт), а s – шкалу (число десяткових цифр в дробовійчастині). Задаваєма шкала не повинна бути від’ємною і не повинна перевищувати значенняточності. При визначенні стовпця можна використовувати скорочені форми – NUMERIC и NUMERIC(p). Перша форма зумовлює використання точності за замовчуванням в реалізації, і шкали, рівної

Модель даних SQL 32

Page 33: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

(p). Перша форма зумовлює використання точності за замовчуванням в реалізації, і шкали, рівноїнулю, а друга – використання заданої точності і шкали, рівної нулю. Допустимі діапазонизначень p и s визначаються в реалізації.

Тип DECIMAL. Цей тип аналогічний типу NUMERIC. Відмінність полягає в тому, що якщо привизначенні стовпця типу DECIMAL задається точність p, то насправді використовуєтьсяточність m, обумовлена в реалізації, така, що m > p. Шкала завжди встановлюється такою,що явно або неявно (за замовчуванням) задається. При вказівці типу стовпця можнавикористовувати специфікації DECIMAL, DECIMAL (p) і DECIMAL (p, s).

Літерали типів точних чисел, що допускають наявність дробової частини, представляються увигляді рядків символів, що зображують десяткові числа, на початку яких можуть бутиприсутнім символи «+» або «-» (якщо символ знаку відсутній, мається на увазі «+»), а усерединіпослідовності цифр може бути присутнім символ «.». Приклади літералів типів NUMERIC іDECIMAL: 125,26.36.

1.1.2. Наближені числові типи.До категорії наближених числових типів в SQL відносяться ті типи, значення якихпредставляють числа наближеним чином. Наближені числа представляються у вигляді пари<мантиса, порядок>, де мантиса складається з значущих цифр числа, а порядок визначаєреальний розмір числа. У реалізаціях наближеним числовим типам SQL зазвичай відповідаютьтипи з плаваючою крапкою. У SQL підтримуються три варіанти наближених числових типів.

Тип REAL. Значення типу відповідають числам з плаваючою точкою одинарної точності.Точність визначається в реалізації, але зазвичай збігається з точністю одинарної плаваючоїарифметики, підтримуваної на апаратній платформі, яка використовується реалізацією. Привизначенні стовпця вказується просто REAL.

Тип DOUBLE PRECISION. Точність значень цього типу визначається в реалізації, але вонаповинна бути більше точності типу REAL. Зазвичай наближеним числам SQL з подвійноюточністю відповідають підтримувані апаратурою числа з плаваючою точкою подвійної точності.При визначенні стовпця вказується просто DOUBLE PRECISION.

Тип FLOAT. Це параметризуємий тип, значення параметра p якого задає необхідну точністьзначень. Потрібно, щоб реально забезпечувана реалізацією точність значень була не менша p.Допустимий діапазон значень параметра p визначається в реалізації. При визначенні стовпцяможна вказати або FLOAT (p), або просто FLOAT. В останньому випадку мається на увазіточність, обумовлена реалізацією за замовчуванням.

Літерали наближених числових типів представляються у вигляді літерала точного числовоготипу, за яким можуть слідувати символ "E" і літерал цілого числового типу. Приклади літералівнаближених числових типів: 123, 123.12, 123E12, 123.12E12.

1.1.3. Типи символьних рядків.У SQL визначено три параметризованих типи символьних рядків: CHARACTER (або CHAR),CHARACTER VARYING (або CHAR VARYING, або VARCHAR) і CHARACTER LARGE OBJECT (або CLOB).

Тип CHARACTER. Значеннями типу є символьні рядки. Конкретний набір допустимих символіввизначається в реалізації, але, як правило, включає набір символів ASCII. При визначенні стовпцядопускається використання специфікацій CHARACTER (x) і просто CHARACTER. Останній варіантеквівалентний завданню CHARACTER (1). Після визначення стовпця типу CHARACTER (x) СУБДбуде резервувати місце для зберігання x символів цього типу у всіх рядках відповідної таблиці.Якщо, наприклад, визначено стовпець типу CHARACTER (8) і в деякому рядку таблиці в ньогозаноситься символьний рядок завдовжки п’ять символів, то реально будуть зберігатисявісім символів, останні три з яких будуть пробілами.

Тип CHARACTER VARYING. При визначенні стовпця допускається використання специфікаційCHARACTER VARYING (x) і просто CHARACTER VARYING. Останній варіант еквівалентний завданнюCHARACTER VARYING (1). Якщо в деякій таблиці визначається стовпець типу CHARACTER VARYING(x), то в кожному рядку цієї таблиці значення даного стовпця займатимуть рівно стільки місця,скільки потрібно для збереження відповідного символьного рядка (але жоден такий рядок неможе складатися більш ніж з x символів).

Тип CHARACTER LARGE OBJECT. Цей тип даних призначений для визначення стовпців, щозберігають великі і різні за розміром групи символів. При визначенні стовпця задаєтьсяспецифікація CLOB (z), де z задає максимальний розмір відповідної групи символів. Максимальноможливе значення параметра z визначається в реалізації, але, очевидно, що воно має бутиістотно більше максимально можливого значення параметра x, присутнього в типах CHAR і CHARVARYING.

Модель даних SQL 33

Page 34: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Літерали типів символьних рядків представляються у вигляді послідовностей символів,укладених в одинарні або подвійні лапки. У першому випадку серед набору символів літераладопускається наявність символів подвійної лапки, а в другому – символів одинарної лапки.Приклади літералів символьних рядків: ‘ABCDEF’, ‘Ab "Ctd’," Fbcdef "," ab’cdtF ".

1.1.4. Типи бітових рядків.У SQL визначено три параметризованих типи бітових рядків: BIT, BIT VARYING і BINARY LARGEOBJECT (або BLOB).

Тип BIT. Значеннями типу є бітові рядки. При визначенні стовпця допускається використанняспецифікацій BIT (x) і просто BIT. Останній варіант еквівалентний завданню BIT (1). Післявизначення стовпця типу BIT (x) СУБД буде резервувати місце для зберігання x біт цьогостовпчика у всіх рядках відповідної таблиці.

Тип BIT VARYING. При визначенні стовпця допускається використання тільки специфікації зазамовченням виду BIT VARYING (x), де значення x визначає максимальну довжину бітової рядки,яку можна зберігати в даному стовпці.

Тип BINARY LARGE OBJECT. Цей тип даних призначений для визначення стовпців, що зберігаютьвеликі і різні за розміром групи байтів. При визначенні стовпця задається специфікація BLOB (z),де z задає максимальний розмір відповідної групи байтів. З технічної точки зору типи CLOB іBLOB дуже схожі. Їх поділ потрібен для того, щоб підкреслити, що значення типу CLOBскладаються з символів, а значення типу BLOB складаються з довільних байтів, не обов’язковокодують символи.

Літерали типів бітових рядків представляються як позначені одинарними лапкамипослідовності символів "0" і "1", які супроводжуються символом "B"; або випереджаютьсясимволом "X" послідовності символів, які зображають шістнадцяткові цифри (за цифрою "9"слідують "A", "B", "C", "D", "E" і "F"). Приклади літералів типів бітових рядків:B’0111001111000111111111 ‘, X’78FBCD0012FFFFA’. 16

1.1.5. Типи дати і часу.Можливість збереження в базі даних інформації про дату і час дуже важлива з практичноїточки зору. У стандарті SQL підтримуються спеціальні "темпоральні" типи даних DATE, TIME,TIMESTAMP, TIME WITH TIME ZONE і TIMESTAMP WITH TIME ZONE. Коротко обговоримо ці типи.

Тип датиТип DATE. Значення цього типу складаються з компонентів - значень року, місяця і дня деякої

дати. Значення року складається з чотирьох десяткових цифр і відповідає літочисленням відРіздва Христового до 9999 р Значення місяці складається з двох десяткових цифр і варіюєтьсявід 01 до 12. Значення номера дня місяця складається з двох десяткових цифр і варіюється від01 до 31, хоча значення місяця дати може накладати обмеження на можливість використаннязначень дня місяця 29, 30 і 31. У стандарті SQL не накладає будь-які обмеження на внутрішнійспосіб представлення дат, використовуваний в реалізації. При визначенні стовпця типу DATEвказується просто DATE.

Літерали типу DATE представляються у вигляді рядка "‘yyyy-mm-dd’", де символи y, m і dповинні зображати десяткові числа. Наприклад, літерал DATE ‘1949-04-08’ представляє дату 8квітня 1949

Типи часуТип TIME. Значення цього параметризованого типу складаються з компонентів-значень

години, хвилини і секунди деякого часу доби. Значення години складається рівно з двохдесяткових цифр і варіюється від 00 до 23. Значення хвилини складається з двох десятковихцифр і варіюється від 00 до 59. Основне значення секунди також складається з двох цифр, алеможе включати додаткові цифри, що представляють частки секунди. Так що в цілому значеннясекунди варіюється від 00 до 61.999 ... У значенні часу присутні дві зайві секунди, оскількиВсесвітня служба часу іноді додає дві секунди до останній хвилині року для синхронізаціїсвітового часу з реальним. Рішення про підтримку цих "високосних" секунд приймається на рівніреалізації. Число цифр у частці секунди також визначається в реалізації. У стандарті потрібнотільки те, щоб це число було не менше шести. При визначенні стовпця типу TIME можевказуватися TIME (p) (значення p задає точність часток секунди) або просто TIME (в цьомувипадку частки секунди не враховуються).

Літерали типу TIME представляються у вигляді рядка TIME ‘hh: mm-ss: f ... f’, де символи h, m,s і f повинні зображати десяткові числа. Наприклад, літерал TIME ‘16: 33-20: 333 ‘представляєчас доби 16 годин 33 хвилини 20 і 333 тисячних секунди.

Модель даних SQL 34

Page 35: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Типи тимчасової міткиТип TIMESTAMP. Значення цього параметризованого типу складаються з компонентів -

значень року, місяця і дня деякої дати, а також компонентів - значень години, хвилини ісекунди деякого часу доби (тобто кожне значення задає деяку абсолютну часову мітку – звідсиназва типу TIMESTAMP). Число десяткових цифр у значеннях-компонентах і обмеження цихзначень такі ж, як у значень типів DATE і TIME. При визначенні стовпця типу TIMESTAMP можевказуватися TIMESTAMP (p) (значення p задає точність часток секунди) або просто TIMESTAMP (вцьому випадку, на відміну від типу даних TIME, за замовчуванням приймається, що в долісекунди використовуються шість десяткових цифр). Максимально допустиме значення pвизначається в реалізації.

Літерали типу TIMESTAMP представляються у вигляді рядка TIMESTAMP ‘yyyy-mm-dd hh: mm-ss: f ... f’, де символи y, m, d, h, m, s і f повинні зображати десяткові числа. Наприклад, літералTIMESTAMP ‘1949-04-08 16: 33-20: 333’ являє часову мітку 16 годин 33 хвилини 20 і 333 тисячнихсекунди 8 квітня 1949

Типи часу і тимчасової мітки з тимчасовою зоноюТип TIME WITH TIME ZONE. Цей тип даних схожий на тип TIME з тією лише відмінністю, що

значення типу TIME WITH TIME ZONE включають додатковий компонент - значення, щохарактеризує зміщення відповідного часу відносно Гринвічем часу (тепер його називають UTC –universal time coordinated). Деталей уявлення цього додаткового компонента ми торкатися небудемо.

Тип TIMESTAMP WITH TIME ZONE. Цей тип даних відрізняється від типу TIMESTAMP тим, щозначення типу TIMESTAMP WITH TIME ZONE включають додатковий компонент-значення, щохарактеризує зміщення відповідного часу відносно Грінвічського.

1.1.6. Типи тимчасових інтервалів.Взагалі кажучи, часовим інтервалом називається різниця між двома значеннями дати або часу. УSQL визначені дві категорії типів тимчасових інтервалів: "рік-місяць" і "день-час доби". Тимчасовіінтервали мови SQL не прив’язуються до початкового та/або кінцевого значення дати/часу, аописують тільки протяжність в часі. У загальному випадку при визначенні стовпця типутимчасового інтервалу вказується INTERVAL start (p) [TO end (q)], де в якості "start" і "end"можуть задаватися YEAR, MONTH, DAY, HOUR, MINUTE і SECOND. Параметр p задає необхіднуточність лідируючого поля інтервалу (число десяткових цифр). Параметр q може задаватисятільки в тому випадку, коли в якості END використовується SECOND, і вказує точність частоксекунди. Якщо говорити більш точно, можливі наступні варіації типів тимчасових інтервалів.

1.1.7. Булевський тип.При визначенні стовпця булевського типу вказується просто специфікація BOOLEAN. Булевськийтип складається з трьох значень: true, false і unknown (відповідні літерали позначаються TRUE,FALSE і UNKNOWN). Підтримується можливість побудови булевських виразів, які обчислюються втризначній логіці. Таблиці істинності основних логічних операцій показані на рис. 2.2.

Модель даних SQL 35

Page 36: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Рисунок 2.2 – Таблиці істинності основних логічних операцій в тризначній логіці

1.1.8. Типи колекцій.Починаючи з SQL:1999, в мові підтримується можливість використання типів даних, значенняяких є колекціями значень деяких інших типів. Зазвичай під терміном колекція розуміється однез наступних утворень: масив, список, множина і мультімножина.

Типи масивівБудь-який можливий тип масиву утворюється шляхом застосування конструктора типів ARRAY.При визначенні стовпця, значення якого повинні належати деякого типу масиву,використовується конструкція dt ARRAY [mc], де dt специфікує деякий допустимий в SQL типданих, а mc є літералом деякого точного числового типу з нульовою довжиною шкали івизначає максимальне число елементів у значенні типу масиву.

Елементам кожного значення типу масиву відповідають їх порядкові номери, звані індексами.Значення індексу завжди повинно належати відрізку [1, mc]. Значеннями типу масиву dt ARRAY[mc] є всі масиви, що складаються з елементів типу dt, максимальне значення індексу яких cs неперевищує значення mc. При збереженні в базі даних значення типу масиву займає стількипам’яті, скільки потрібно для збереження cs елементів. Забезпечується доступ до елементівмасиву по їх індексах. Зокрема, можна оголосити стовпець типу INTEGER ARRAY [10] і при вставцірядка в відповідну таблицю задати значення тільки п’ятого елементу масиву. Тоді в рядок будезанесений масив з п’яти елементів, причому перші чотири елементи будуть містити невизначенезначення (NULL).

Типи мультимножин.При визначенні стовпця таблиці типу мультимножин використовується конструкція dt MULTISET,д е dt задає тип даних елементів конструйованого типу мультимножин. Значеннями типумультимножин є мультимножини, тобто невпорядковані колекції елементів одного і того жтипу, серед яких допускаються дублікати. Наприклад, значеннями типу INTEGER MULTISET ємультимножини, елементами яких є цілі числа. Прикладом такого значення може бутимультімножина {12, 34, 12, 45, -64}.

На відміну від масиву, мультімножина є необмеженою колекцією; при конструюванні типумультимножин не вказується гранична кардинальність значень цього типу. Однак це неозначає, що можливість вставки елементів у мультімножину дійсно не обмежена; стандартлише не вимагає явного оголошення кордону. Ситуація аналогічна тій, яка виникає при роботі зтаблицями, для яких в SQL не оголосить максимально допустиму кількість рядків.

Модель даних SQL 36

Page 37: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

1.1.9. Анонімні рядкові типи.Анонімний рядковий тип – це конструктор типів ROW, що дозволяє проводити безіменні типирядків (кортежів). Будь-який можливий рядковий тип утворюється шляхом використанняконструктора ROW. При визначенні стовпця, значення якого повинні належати деякомурядковому типу, використовується конструкція ROW (fld1, fld2, ѕ, fldn), де кожен елемент fldi, щовизначає поле сатиричного типу, задається у вигляді трійки fldname, fldtype, fldoptions.Піделемент fldname задає ім’я відповідного поля сатиричного типу. Піделемент fldtypeспецифікує тип даних цього поля. В якості типу даних поля сатиричного типу можнавикористовувати будь допустимий в SQL тип даних, включаючи типи колекцій, обумовленікористувачами типи та інші рядкові типи. Необов’язковий піделемент fldoptions можезадаватися для вказівки застосовуваного за замовчуванням порядку сортування, якщовідповідний піделементи fldtype вказує на тип символьних рядків, а також повинен здаватися,якщо fldtype вказує на контрольний тип. Ступенем сатиричного типу називається число йогополів.

1.1.10. Типи, визначені користувачем.Ця категорія типів даних пов’язана з об’єктними розширеннями мови SQL.

Структурні типи (Structured Types).Стандарт SQL не накладає обмежень на складність одержуваної в результаті структури даних,однак не забороняє встановлювати такі обмеження в реалізації. Додаткові механізмивизначених користувачами методів, функцій і процедур дозволяють визначити поведінковіаспекти структурного типу.

Індивідуальні типи (Distinct Types).Можна визначити тривалий зберігаємий іменований тип даних, спираючись на єдинийзумовлений тип. Наприклад, можна визначити індивідуальний тип даних PRICE, спираючись натип DECIMAL (5, 2). Тоді значення типу PRICE представляються точно так само, як значення типуDECIMAL (5, 2). Інша можливість полягає в явному визначенні методів, функцій і процедур,пов’язаних з даним індивідуальним типом.

1.1.11. Посилальні типи.Ця категорія типів даних пов’язана з об’єктними розширеннями мови SQL. Забезпечуєтьсямеханізм конструювання типів (посилальних типів), які можуть використовуватися в якості типівстовпців деякого виду таблиць (типізованих таблиць). Фактично значеннями посилального типує рядки відповідної типізованої таблиці. Більш точно, кожному рядку типізованої таблиціприписується унікальне значення (щось подібне первинного ключа, призначуваного системоюабо додатком), яке може використовуватися в методах, визначених для табличного типу, дляунікальної ідентифікації рядків відповідної таблиці. Ці унікальні значення називаютьсяпосилальними значеннями, а їх тип – посилальним типом. Контрольний тип може містити тількиті значення, які дійсно посилаються на екземпляри зазначеного типу.

1.2 Засоби визначення, зміни визначення та відміни доменівПри визначенні стовпців таблиці потрібно явно вказувати тип даних кожного стовпця. Дляцього можна використовувати описані вище засоби специфікації типу. Але в SQL підтримується іінший механізм – механізм доменів. Домен є довготривало зберігаємим, іменованим об’єктомсхеми бази даних. Домени можна створювати (визначати), змінювати (змінювати визначення) іліквідувати (скасовувати визначення). Імена доменів можна використовувати при визначенністовпців таблиць. Можна вважати, що в SQL визначення домена є винесеним за межівизначення індивідуальної таблиці «родове» визначення стовпця, яке можна використовуватидля визначення різних реальних стовпців реальних базових таблиць. У мові SQL забезпечуютьсязасоби визначення доменів, зміни та скасування існуючих визначень.

Модель даних SQL 37

Page 38: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

1.2.1. Визначення домену.Для визначення домену в SQL використовується оператор CREATE DOMAIN. Загальний синтаксисцього оператора такий:

domain_definition :: = CREATE DOMAIN domain_name [AS] data_type[Default_definition][Domain_constraint_definition_list]

Тут domain_name задає ім’я створюваного домена, data_type є специфікація визначальноготипу даних. У необов’язкових розділах default_definition і domain_constraint_definition_listспецифікуються значення домену за замовченням і набір обмежень цілісності, які будутьзастосовуватися до будь-якого стовпця, визначеним на цьому домені.

Розділ default_definition має виглядDEFAULT {literal | niladic_function | NULL}

Тут literal представляє будь-яке припустиме літеральне значення визначального типу домена,NULL позначає невизначене значення, а niladic_function може задаватися в одній з наступнихформ:

USERCURRENT_USERSESSION_USERSYSTEM_USERCURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP

Якщо в операторі CREATE DOMAIN значення за замовчуванням не специфікується, вважається,що такого значення немає. Проте пізніше до визначення домену можна додати розділ значенняза замовчуванням за допомогою оператора ALTER DOMAIN. Крім того, цей оператор дозволяєвидалити розділ значення за замовчуванням з існуючого визначення домена.

Елемент списку domain_constraint_definition_list має вигляд[CONSTRAINT constraint_name] CHECK (conditional_expression)

Необов’язковий розділ CONSTRAINT constraint_name дозволяє визначити ім’я новогообмеження цілісності. Якщо явна вказівка імені відсутня, обмеженню призначається ім’я, щоавтоматично генерується системою. Що стосується виду умовного виразу, що є власнеобмеженням цілісності, то в стандарті забороняється лише пряме або непряме використання уньому домену, в визначення якого входить даний умовний вираз. Однак найбільш природним (інайбільш поширеним) видом обмеження домену є таке:

CHECK (VALUE IN (list_of_valid_values))Таке обмеження забороняє появу в будь-якому стовпці, визначеному на даному домені, будь-

якого значення визначального типу, що не входить в список допустимих значень.Приклади визначень доменів

У прикладах ми матимемо справу з таблицями службовців (EMP), відділів (DEPT) і проектів(PRO). Кожен службовець володіє унікальним номером (EMP_NO) і отримує заробітну плату(SALARY). Визначимо домени EMP_NO і SALARY.

CREATE DOMAIN EMP_NO AS INTEGERCHECK (VALUE BETWEEN 1 AND 2000);

Номери службовців є цілими числами, тому базовий тип домену EMP_NO є тип INTEGER. Крімтого, на значення цього домену встановлюється наступне обмеження: вони повинні бути більшенуля і не перевершувати ціле значення 2000.

Домен SALARY визначимо наступним чином:CREATE DOMAIN SALARY AS NUMERIC (10, 2)DEFAULT 2000.00CHECK (VALUE BETWEEN 2000.00 AND 20000000.00)CONSTRAINT SAL_NOT_NULL CHECK (VALUE IS NOT NULL);

Розмір заробітної плати є значенням точного числового типу NUMERIC з десяти десятковихцифр, дві з яких складають дробову частину. За замовчуванням розмір заробітної платистановить 2000 грн. Встановлено діапазон допустимого розміру зарплати від 2000 грн до20000000 грн. Невизначене значення зарплати не допускається (на рівні визначення домена).

1.2.2. Зміна визначення домену.Для зміни характеристик раніше визначеного домену використовується оператор SQL ALTERDOMAIN. Синтаксис цього оператора виглядає наступним чином:

Модель даних SQL 38

Page 39: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

domain_alternation :: =ALTER DOMAIN domain_name domain_alternation_actiondomain_alternation_action :: =domain_default_alternation_action| Domain_constraint_alternation_action

Як видно з синтаксичних правил, при зміні визначення домену можна виконати дію зі змінирозділу стандартне значення або змінити обмеження домену. Для першого варіанту дієнаступний синтаксис:

domain_default_alternation_action :: =SET default_definition | DROP DEFAULT

У випадку встановлення нового значення за замовчуванням (SET) це значення автоматичнозастосовується до всіх стовпців, визначених на даному домені. Більш точно, це значення стаєновим значенням за замовчуванням. Операція не впливає на стан існуючих рядків таблиць базиданих. У разі скасування розділу значення за замовчуванням у визначенні домену (DROP) існуючезначення домену за замовчуванням стає значенням за замовчуванням кожного стовпця, якийвизначений на даному домені і для якого не специфікована власне значення за замовчуванням.

Дія по зміні обмеження домену визначається наступним синтаксисом:domain_constraint_alternation_action :: =ADD domain_constraint_definition | DROP CONSTRAINT constraint_name

Дія по додаванню нового визначення обмеження домену (ADD) призводить до того, що новаумова додається через AND до існуючого обмеження домену. Якщо до моменту виконаннявідповідного оператора ALTER DOMAIN існують стовпці деяких таблиць, поточні значення якихсуперечать новому обмеженню, то СУБД має відкинути цей оператор ALTER DOMAIN. Дія заскасування обмеження домену (DROP) призводить до зникнення відповідної частини загальногообмеження відповідного домену, що, природно, не впливає на існуючі значення стовпців наявнихтаблиць.Приклади зміни визначення домену

Для зміни значення заробітної плати за умовчанням (домен SALARY) з 2000 на 3000 грн.потрібно виконати оператор

ALTER DOMAIN SALARY SET DEFAULT 3000.00;Для скасування значення за замовчуванням в домені SALARY слід скористатися оператором

ALTER DOMAIN SALARY DROP DEFAULT;Якщо до визначення домену SALARY потрібно додати обмеження (наприклад, заборонити

значення зарплати, рівне 1800 грн.), необхідно виконати операторALTER DOMAIN SALARY ADD CHECK (VALUE <> 1800.00);

Нарешті, якщо потрібно скасувати (іменоване!) обмеження цілісності, що перешкоджаєнаявності невизначених значень у стовпцях, які визначені на домені SALARY, то потрібновиконати оператор

ALTER DOMAIN SALARY DROP CONSTRAINT SAL_NOT_NULL;

1.2.3. Ліквідація домену.Щоб скасувати раніше створене визначення домену, потрібно скористатися оператором DROPDOMAIN в наступному синтаксисі:

DROP DOMAIN domain_name {RESTRICT | CASCADES}Якщо в операторі вказано RESTRICT і якщо відповідний домен використаний у визначенні

деякого стовпця, у визначенні деякого подання або у визначенні обмеження цілісності, тооператор DROP DOMAIN відкидається. В іншому випадку визначення домену ліквідується.

Якщо в операторі DROP DOMAIN вказано CASCADES, то оператор виконується завжди. Прицьому знищуються всі уявлення і обмеження цілісності, у визначенні яких використовувалося ім’яданого домена. Стовпці, визначені на цьому домені, автоматично перевизначаються такимчином:

вважається, що кожен такий стовпець тепер відноситься до визначального типомзнищуваного домена;якщо у стовпця не було визначено власне значення за замовчуванням, то вважається, щотепер у нього є таке значення за замовчуванням, що збігається зі значенням зазамовчуванням знищуваного домена;кожен стовпець успадковує всі обмеження знищуваного домена.

Модель даних SQL 39

Page 40: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

1.3 Засоби визначення базових таблиць та обмежень цілісностіЯк і в реляційній моделі даних, в моделі SQL підтримується єдина родова структура даних,названа в даному випадку базовою таблицею.

Поняття базової таблиці родинно поняттю відношення: можна вважати, що базова таблицяволодіє заголовком, в якому містяться розрізнені імена стовпців та їх типи даних (заголовокбазової таблиці є множиною і являє собою близький аналог заголовка відношення), і т ілом, щовключає рядки, які відповідають заголовку таблиці (здавалося б, тут ми маємо аналоги тілавідношення і кортежів). Але корінна відмінність базової таблиці від справжнього відношенняполягає в тому, що тіло таблиці не обов’язково є множиною. Серед рядків тіла таблиці можутьзустрічатися дублікати, і в загальному випадку тіло базової таблиці SQL являє собоюмультимножину рядків.

Слід зауважити, що породжувані таблиці SQL, які формуються при виконанні запитів до SQL-орієнтованої базі даних, ще більш віддаляють SQL від реляційної моделі. У таких таблицях можебути відсутнім і правильно сформований заголовок (можуть бути однойменні стовпці).

Для неформальної назви SQL мовою реляційних баз даних є кілька причин.По-перше, використовуючи мову SQL, можна не порушувати вимог до реляційної моделі, і тоді

до "правильно побудованої" SQL-орієнтованої базі даних можуть бути застосовані всіфундаментальні результати теорії реляційних баз даних, включаючи принципи проектування наоснові нормалізації.

По-друге, повністю відкидаючи спорідненість мови SQL з реляційною моделлю даних, мивиступали б проти сталих історичних традицій. Ця мова виникла близько 30 років тому під часреалізації в компанії IBM проекту по створенню експериментальної СУБД System R, основноюметою якого було обґрунтування практичної реалізації реляційного підходу до організації базданих. Так що історично SQL базувався на реляційної моделі даних (можливо, не зовсім вірнопонятий та / або втіленої).

Нарешті, на нашу думку, в області інформаційної технології будь практично використовуванийінструмент не може бути повністю вільний від компромісів. Ідеологічно чисті рішення можливітільки в науково-експериментальній роботі. "Велика і жахлива" мова SQL – це породження рядукомпромісів між теорією, практикою і маркетинговою діяльністю. Ця мова є настількиреляційною, наскільки це знадобилося споживачам комерційних СУБД, прямо або побічнофінансуючих розробку мови.

В операторі SQL CREATE TABLE специфікуються не тільки стовпці таблиці, а й обмеженняцілісності, яким повинні задовольняти дані, що зберігаються в базовій таблиці. Ці обмеження єокремим випадком обмежень бази даних цілком, для визначення яких, а також зміни таліквідації визначень є спеціальні оператори.

1.3.1. Засоби визначення базових таблиць.Базові (реально збережені в базі даних) таблиці створюються (визначаються) з використаннямоператора CREATE TABLE. Для зміни визначення базової таблиці застосовується оператор ALTERTABLE. Знищити збережену таблицю (скасувати її визначення) можна за допомогою оператораDROP TABLE.

Зауваження: хоча зовні оператори CREATE TABLE, ALTER TABLE і DROP TABLE схожі на відповідніоператори визначення, зміни визначення та ліквідації домену, між ними є принциповавідмінність. Визначення домену призводить всього лише до створення деяких нових описів, щовходять до складу метаданих бази даних. Створення базової таблиці, окрім створеннявідповідних описів, породжує нову область зовнішньої пам’яті, в якій зберігатимуться дані, щоподаються користувачами. Тим самим, базова таблиця SQL-орієнтованої бази даних є прямиманалогом змінної відношення реляційної моделі даних.

Визначення базової таблиціОператор створення базової таблиці CREATE TABLE має наступний синтаксис:

base_table_definition :: = CREATE TABLE base_table_name(base_table_element_commalist)

base_table_element :: = column_definition | base_table_constraint_definitionТут base_table_name задає ім’я нової (спочатку порожній) базової таблиці. Кожен елемент

визначення базової таблиці є або визначенням стовпця, або визначенням табличного обмеженняцілісності.

Визначення стовпцяЕлемент визначення стовпця специфікується на основі наступних синтаксичних правил:

column_definition :: = column_name {Data_type | domain_name}

Модель даних SQL 40

Page 41: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

[Default_definition] [Column_constraint_definition_list]В елементі визначення стовпця column_name задає ім’я визначає стовпці. Тип стовпця

специфікується шляхом явного вказівки типу даних (data_type) або шляхом зазначення іменіраніше визначеного домену (domain_name).

Значення стовпця за замовчуваннямНеобов’язковий розділ визначення значення стовпця за замовчуванням має той же синтаксис,що і розділ визначення значення за замовчуванням в операторах визначення або змінивизначення домену:

DEFAULT {literal | niladic_function | NULL}Чинне значення за замовчуванням для даного стовпця визначається так:

якщо у визначенні стовпця явно присутній розділ DEFAULT, то значенням стовпця зазамовчуванням є значення, вказане в цьому розділі;інакше, якщо стовпець визначається на домені і у визначенні цього домену явно присутнійрозділ DEFAULT, то значенням стовпця за замовчуванням є значення, вказане в цьомурозділі;інакше значенням за замовчуванням стовпця є NULL.

Зауважимо, що якщо значенням за замовчуванням неявно оголошено невизначене значення(NULL), але серед обмежень цілісності стовпця присутнє обмеження NOT NULL, то вважається,що у стовпця взагалі відсутнє значення за замовчуванням. Це означає, що при будь-якій вставцінового рядка у відповідну базову таблицю значення даної комірки має бути задане явно.

Обмеження цілісності стовпцяЕлемент необов’язкового списку обмежень цілісності стовпця визначається наступнимисинтаксичними правилами:

column_constraint_definition :: = [CONSTRAINT constraint_name]NOT NULL | {PRIMARY KEY | UNIQUE}| References_definition | CHECK (conditional_expression)

Будь-яке обмеження цілісності, що включається у визначення стовпця, може бутиеквівалентним чином виражено у вигляді табличного обмеження цілісності. Єдиний резонвизначення обмежень на рівні стовпця полягає в тому, що в цьому випадку в обмеженніцілісності не потрібно явно вказувати ім’я стовпця. Тим не менш, коротко розглянемо обмеженняцілісності стовпця окремо.

Обмеження NOT NULL означає, що в обумовленому стовпці ніколи не повинні міститисяневизначені значення. Якщо визначається стовпець має ім’я C, то це обмеження еквівалентнонаступному табличному обмеженню: CHECK (C IS NOT NULL).

У визначення стовпця може входити одне з обмежень унікальності: обмеження первинногоключа (PRIMARY KEY) або обмеження можливого ключа (UNIQUE). Включення у визначеннястовпця будь-якого з цих обмежень означає вимогу унікальності значень визначає стовпці(тобто протягом існування обумовленої таблиці у всіх її рядках значення даного стовпця повиннібути різні). Обмеження PRIMARY KEY, на додаток до цього, тягне за собою обмеження NOT NULLдля визначає стовпці. Ці обмеження стовпця еквівалентні наступним табличним обмеженням:PRIMARY KEY (C) і UNIQUE (С).

Обмеження references_definition означає, що оголошення визначає стовпці зовнішнім ключемтаблиці і володіє наступним синтаксисом:

references_definition :: = REFERENCES base_table_name [(column_commalist)] [MATCH{SIMPLE | FULL | PARTIAL}]

[ON DELETE referential_action] [ON UPDATE referential_action]Насправді, дана синтаксична конструкція працює і в разі визначення зовнішнього ключа на

рівні таблиці (в одному з визначень табличних обмежень цілісності). Відзначимо, що привикористанні конструкції на рівні визначення стовпця column_commalist може містити ім’я тількиодного стовпчика (бо зовнішній ключ складається з одного стовпця). Обмеження еквівалентнонаступному табличному обмеженню: FOREIGN KEY (C) references_definition.

Перевірочне обмеження CHECK (conditional_expression) призводить до того, що в даномустовпці можуть перебувати тільки ті значення, для яких обчислення conditional_expression неприводить до результату false. В умовному вираженні перевірочного обмеження стовпцядозволяється використовувати ім’я тільки визначає стовпці. Зауважимо, що перевірочнеобмеження стовпця може бути без жодних змін перенесено на рівень визначення табличнихобмежень.

Модель даних SQL 41

Page 42: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

1.3.2. Визначення табличного обмеження.Елемент визначення табличного обмеження цілісності задається так:

base_table_constraint_definition :: = [CONSTRAINT constraint_name] {PRIMARY KEY | UNIQUE} (column_commalist) | FOREIGN KEY (column_commalist)references_definition | CHECK (conditional_expression)

Як ми бачимо, є три різновиди табличних обмежень: обмеження первинного або можливогоключа (PRIMARY KEY або UNIQUE), обмеження зовнішнього ключа (FOREIGN KEY) і перевірочнеобмеження (CHECK). Будь-якому обмеженню може явно призначатися ім’я, якщо передвизначенням обмеження помістити конструкцію CONSTRAINT constraint_name.

Табличне обмеження первинного або можливого ключаТабличне обмеження первинного або можливого ключа {PRIMARY KEY | UNIQUE}(column_commalist) означає вимогу унікальності складових значень зазначеної групи стовпців(тобто протягом всього часу існування обумовленої таблиці у всіх її рядках складові значенняданої групи стовпців повинні бути різні). Обмеження PRIMARY KEY, на додаток до цього, тягнеобмеження NOT NULL для всіх стовпців, згадуваних у визначенні обмеження. У визначеннітаблиці допускається довільне число визначень можливого ключа (для різних комбінаційстовпців), але не більше одного визначення первинного ключа. Зверніть особливу увагу наостанню частину попереднього речення: у мові SQL дійсно допускається визначення таблиць, уяких відсутні можливі ключі. Ця особливість мови, серед іншого, очевидним чином суперечитьбазовим вимогам реляційної моделі даних.

Визначення табличного обмеження виду CHECK (conditional_expression) призводить до того,що вказаний умовний вираз буде обчислюватися при кожній спробі оновлення відповідноїтаблиці (вставці нового рядка, видалення або модифікації існуючого рядка). Вважається, щоспроба оновлення таблиці порушує перевірочне обмеження цілісності, якщо після виконанняоперації поновлення обчислення умовного вираження дає результат false. Іншими словами,таблиця знаходиться у відповідності з даними перевірочним табличним обмеженням, якщо длявсіх рядків таблиці результатом обчислення відповідного умовного вираження не є false.

Табличне обмеження зовнішнього ключаТабличне обмеження FOREIGN KEY (column_commalist) references_definition означає оголошеннязовнішнім ключем групи стовпців, імена яких перераховані в списку column_commalist.Синтаксичне правило має вигляд:

references_definition :: = REFERENCES base_table_name [(column_commalist)] [MATCH {SIMPLE | FULL | PARTIAL}] [ON DELETE referential_action] [ON UPDATE referential_action]

У цьому визначенні base_table_name має представляти собою ім’я деякої базової таблиці(нехай, наприклад, ця таблиця має ім’я T). Якщо визначення посилань включає список стовпців(column_commalist), то цей список повинен збігатися (з точністю до порядку проходження іменстовпців) зі списком імен стовпців, використаних в деякому визначенні первинного абоможливого ключа (PRIMARY KEY або UNIQUE) у визначенні таблиці T. Якщо в визначенні посиланьсписок стовпців явно не заданий, то вважається, що він збігається зі списком стовпців,використаних у визначенні первинного ключа (PRIMARY KEY) таблиці T.

Різновиди способів зіставлення значень зовнішнього і можливого ключів. Нехай обумовленатаблиця має ім’я S. Обговоримо сенс необов’язкового розділу визначення зовнішнього ключаMATCH {SIMPLE | FULL | PARTIAL} . Якщо цей розділ відсутній або якщо присутній і має виглядMATCH SIMPLE, то обмеження зовнішнього ключа (посилальне обмеження) задовольняється втому і т ільки в тому випадку, коли для кожного рядка таблиці S виконується одна з наступнихумов:

будь-який стовпець, що входить до складу зовнішнього ключа, містить NULL;таблиця T містить в точності один рядок, такий, що значення зовнішнього ключа в цьомурядку таблиці S збігається зі значенням відповідного можливого ключа в цьому рядкутаблиці T.

Якщо розділ MATCH присутній у визначенні зовнішнього ключа і має вигляд MATCH PARTIAL, тообмеження зовнішнього ключа задовольняється в тому і т ільки в тому випадку, коли для

Модель даних SQL 42

Page 43: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

кожного рядка таблиці S виконується одна з наступних умов:

кожен стовпець, що входить до складу зовнішнього ключа, містить NULL;таблиця T містить принаймні один такий рядок, що для кожного стовпця даного рядкатаблиці S, значення якого відмінно від NULL, його значення збігається зі значеннямвідповідного стовпця можливого ключа в цьому рядку таблиці T.

Якщо розділ MATCH має вигляд MATCH FULL, то обмеження зовнішнього ключа задовольняєтьсяв тому і т ільки в тому випадку, коли для кожного рядка таблиці S виконується одна з наступнихумов:

кожен стовпець, що входить до складу зовнішнього ключа, містить NULL;жоден стовпець, що входить до складу зовнішнього ключа, не містить NULL, і таблиця Tмістить в точності один рядок, такий, що значення зовнішнього ключа в цьому рядкутаблиці S збігається зі значенням відповідного можливого ключа в цьому рядку таблиці T.

Очевидно, що тільки при наявності специфікації MATCH FULL посилальне обмеження відповідаєвимогам реляційної моделі. Проте у визначенні обмеження зовнішнього ключа базових таблиць вSQL за умовчанням передбачається наявність специфікації MATCH SIMPLE

1.3.3. Підтримка посилальної цілісності і посилальні дії.В зв’язку з визначенням обмеження зовнішнього ключа нам залишилося розглянути ще дванеобов’язкових розділи – ON DELETE referential_action і ON UPDATE referential_action. Насамперед,опишемо синтаксичне правило:

referential_action :: ={NO ACTION | RESTRICT | CASCADE | SET DEFAULT | SET NULL}

Щоб пояснити, в яких випадках і яким чином виконуються ці дії, потрібно спочатку визначитипоняття посилального рядка (referencing row). Якщо у визначенні обмеження зовнішнього ключавідсутній розділ MATCH або присутні специфікації MATCH SIMPLE чи MATCH FULL, то для цьогорядка t таблиці T рядком таблиці S, що посилається на рядок t, називається кожен рядоктаблиці S, значення зовнішнього ключа якої збігається зі значенням відповідного можливогоключа рядка t. Якщо у визначенні обмеження зовнішнього ключа присутня специфікація MATCHPARTIAL, то для цього рядка t таблиці T рядком таблиці S, що посилається на рядок t,називається кожен рядок таблиці S, відмінні від NULL значення стовпців зовнішнього ключа якоїзбігаються зі значеннями відповідних стовпців відповідного можливого ключа рядка t. У разіMATCH PARTIAL рядок таблиці S називається посилається виключно на рядок t таблиці T, якщоцей рядок таблиці S є посилається на рядок t і не є посиланням на будь-який інший рядоктаблиці T.

Розглянемо посилальні дії. Нехай визначення обмеження зовнішнього ключа містить розділ ONDELETE referential_action. Припустимо, що робиться спроба видалити рядок t з таблиці T. Тоді:

якщо в якості необхідної посилальної дії вказано NO ACTION або RESTRICT, то операціявидалення відкидається, якщо її виконання викликало б порушення обмеженнязовнішнього ключа;якщо в якості необхідної посилальної дії вказано CASCADE, то рядок t видаляється, і якщоу визначенні обмеження зовнішнього ключа відсутній розділ MATCH або присутніспецифікації MATCH SIMPLE або MATCH FULL, то видаляються всі рядки, що посилаються наt. Якщо ж у визначенні обмеження зовнішнього ключа присутня специфікація MATCHPARTIAL, то видаляються тільки ті рядки, які посилаються виключно на рядок t;якщо в якості необхідної посилальної дії вказано SET DEFAULT, то рядок t видаляється, і увсіх стовпцях, які входять до складу зовнішнього ключа, всіх рядків, що посилаються нарядок t, проставляється задане при їх визначенні значення за замовчуванням. Якщо увизначенні зовнішнього ключа міститься специфікація MATCH PARTIAL, то подібного впливупіддаються тільки ті рядки таблиці S, які посилаються виключно на рядок t;якщо в якості необхідної посилальної дії вказано SET NULL, то рядок t видаляється, і у всіхстовпцях, які входять до складу зовнішнього ключа, всіх рядків, що посилаються на рядокt, проставляється NULL. Якщо у визначенні зовнішнього ключа міститься специфікаціяMATCH PARTIAL, то подібного впливу піддаються тільки ті рядки таблиці S, якіпосилаються виключно на рядок t.

Нехай визначення обмеження зовнішнього ключа містить розділ ON UPDATE referential_action.Припустимо, що робиться спроба оновити стовпці відповідного можливого ключа в рядку t зтаблиці T. Тоді:

Модель даних SQL 43

Page 44: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

якщо в якості необхідної посилальної дії вказано NO ACTION або RESTRICT, то операціяоновлення відкидається, якщо її виконання викликало б порушення обмеженнязовнішнього ключа;якщо в якості необхідної посилальної дії вказано СASCADE, то рядок t оновлюється, і якщоу визначенні обмеження зовнішнього ключа відсутній розділ MATCH або присутніспецифікації MATCH SIMPLE або MATCH FULL, то відповідним чином оновлюються всі рядки,що посилаються на t (в них належним чином змінюються значення стовпців, що входятьдо складу зовнішнього ключа). Якщо ж у визначенні обмеження зовнішнього ключаприсутня специфікація MATCH PARTIAL, то оновлюються тільки ті рядки, які посилаютьсявиключно на рядок t;якщо в якості необхідної посилальної дії вказано SET DEFAULT, то рядок t оновлюється, і увсіх стовпцях, які входять до складу зовнішнього ключа і відповідають змінним стовпцяхтаблиці T, всіх рядків, що посилаються на рядок t, проставляється задане при їхвизначенні значення за замовчуванням. Якщо у визначенні зовнішнього ключа міститьсяспецифікація MATCH PARTIAL, то подібного впливу піддаються тільки ті рядки таблиці S,які посилаються виключно на рядок t, причому в них змінюються значення тільки тихстовпців, які не містили NULL;якщо в якості необхідної посилальної дії вказано SET NULL, то рядок t оновлюється, і у всіхстовпцях, які входять до складу зовнішнього ключа і відповідають змінним стовпцяхтаблиці T, всіх рядків, що посилаються на рядок t, проставляється NULL. Якщо увизначенні зовнішнього ключа міститься специфікація MATCH PARTIAL, то подібного впливупіддаються тільки ті рядки таблиці S, які посилаються виключно на рядок t.

1.3.4. Приклади визначення таблиць.Визначимо таблиці службовців, відділів та проектів.

Стовпці EMP_NO, EMP_SAL, DEPT_NO, PRO_NO, DEPT_TOTAL_SAL, DEPT_MNG і PRO_MNGвизначаються на раніше визначених доменах (визначення доменів EMP_NO і SALARY наведені впопередній лекції). Первинними ключами відносин EMP, DEPT і проектів PRO є стовпці EMP_NO,DEPT_NO і PRO_NO відповідно. У таблиці EMP стовпці DEPT_NO і PRO_NO є зовнішніми ключами, щовказують на відділ, в якому працює службовець, і на виконуваний ним проект відповідно. Утаблиці DEPT зовнішнім ключем є стовпець DEPT_MNG, який вказує на службовця, є керівникомвідповідного відділу, а в таблиці PRO зовнішнім ключем є стовпець PRO_MNG, який вказує наслужбовця, що є менеджером відповідного проекту. Інші обмеження цілісності ми обговоримопізніше.

Визначимо таблицю EMP:(1) CREATE TABLE EMP ((2) EMP_NO EMP_NO PRIMARY KEY,(3) EMP_NAME VARCHAR (20) DEFAULT ‘Incognito’ NOT NULL,(4) EMP_BDATE DATE DEFAULT NULL CHECK ( VALUE> = DATE ‘1917-10-24’),(5) EMP_SAL SALARY,(6) DEPT_NO DEPT_NO DEFAULT NULL REFERENCES DEPT ON DELETE SET NULL,(7) PRO_NO PRO_NO DEFAULT NULL,(8) FOREIGN KEY PRO_NO REFERENCES PRO (PRO_NO) ON DELETE SET NULL,(9) CONSTRAINT PRO_EMP_NO CHECK((SELECT COUNT (*) FROM EMP EWHERE E.PRO_NO = PRO_NO) <= 50));

Послідовно обговоримо частини цього визначення. У частині (1) вказується, що створюєтьсятаблиця з ім’ям EMP. У частині (2) визначається стовпець EMP_NO на домені EMP_NO. У цьогостовпця не визначене значення за замовчуванням , і він оголошений первинним ключем таблиці(це обмеження цілісності додається через AND до обмежень, успадкованим стовпцем відвизначення домена). Крім іншого, це означає неявне вказівку заборони для даного стовпцяневизначених значень. У частині (3) визначено стовпець EMP_NAME на базовому типі данихсимвольних рядків змінної довжини з максимальною довжиною 20. Для стовпця вказанозначення за замовчуванням – рядок ‘Incognito’, і в якості обмеження цілісності забороненіневизначені значення. У частині (4) визначається стовпець EMP_BDATE (дата народженняслужбовця). Він має тип даних DATE, значенням за замовчуванням є NULL (дати народженнядеяких службовців невідомі). Крім того, обмеження стовпця забороняє приймати на роботу осіб,про які відомо, що вони народилися до Жовтневого перевороту. У частині (5) визначеностовпець EMP_SAL на домені SALARY. Значення за замовчуванням і обмеження цілісності

Модель даних SQL 44

Page 45: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

успадковуються з визначення домену. У частині (6) стовпець DEPT_NO визначається наоднойменному домені (для наших цілей його визначення несуттєво), але явно оголошується, щозначенням за замовчуванням цього стовпця буде NULL (деякі службовці не приписані дожодного відділу). Крім того, додається обмеження зовнішнього ключа: стовпець DEPT_NOпосилається на первинний ключ таблиці DEPT. Визначено посилальну дію: при видаленні рядка зтаблиці DEPT у всіх рядках таблиці EMP, що посилалися на цей рядок, стовпцю DEPT_NO повиннобути присвоєно невизначене значення. У частині (7) визначається стовпець PRO_NO. Йоговизначення аналогічно визначенню стовпця DEPT_NO, але обмеження зовнішнього ключавинесено в частину (8), де воно визначається в повній формі як табличне обмеження. Нарешті, вчастині (9) визначається табличне перевірочне обмеження з ім’ям PRO_EMP_NO, яке вимагає,щоб ні в одному проекті не брало участь більше 50 службовців).

Визначимо таблицю DEPT:

(1) CREATE TABLE DEPT ((2) DEPT_NO DEPT_NO PRIMARY KEY,(3) DEPT_EMP_NO INTEGER NOT NULL CHECK ( VALUE BETWEEN 1 AND 100),(4) DEPT_NAME VARCHAR (200) DEFAULT ‘Nameless’ NOT NULL,(5) DEPT_TOTAL_SAL SALARY DEFAULT 1000000.00 NOT NULL CHECK (VALUE> =

100000.00),(6) DEPT_MNG EMP_NO DEFAULT NULL REFERENCES EMP ON DELETE SET NULLCHECK (IF (VALUE IS NOT NULL) THEN

((SELECT COUNT (*) FROM DEPTWHERE DEPT.DEPT_MNG = VALUE) = 1),

(7) CHECK (DEPT_EMP_NO =(SELECT COUNT (*) FROM EMPWHERE DEPT_NO = EMP.DEPT_NO)),

(8) CHECK (DEPT_TOTAL_SAL> =(SELECT SUM (EMP_SAL) FROM EMPWHERE DEPT_NO = EMP.DEPT_NO)));

Відзначимо тільки найбільш цікаві моменти. У частині (3) стовпець DEPT_EMP_NO (числослужбовців у відділі) визначений на базовому типі INTEGER без значення за замовчуванням, іззабороною невизначеного значення і з перевірочним обмеженням, що встановлює допустимийдіапазон значень числа службовців у відділі. Ще одне перевірочне обмеження цього стовпця (7)- винесено на рівень визначення табличного обмеження. Це обмеження встановлює, що вкожному рядку таблиці DEPT значення стовпця DEPT_EMP_NO повинна дорівнювати загальномучислу рядків таблиці EMP, в яких значення стовпця DEPT_NO дорівнює значенню однойменногостовпця даного рядка таблиці DEPT. 9 У частині (5) для визначення стовпця DEPT_TOTAL_SAL(обсяг фонду заробітної плати відділу) використовується домен SALARY 10. Але при цьому явновстановлено значення стовпця за замовчуванням (відмінне від значення за замовчуваннямдомена), заборонено наявність невизначених значень і введено додаткове перевірочнеобмеження, визначальне нижній поріг обсягу фонду заробітної плати відділу. Ще однеперевірочне обмеження – (8) - винесено на рівень визначення табличного обмеження. Цеобмеження встановлює, що в кожному рядку таблиці DEPT значення стовпця DEPT_TOTAL_SALповинно бути не менше суми значень стовпця EMP_SAL у всіх рядках таблиці EMP, в якихзначення стовпця DEPT_NO дорівнює значенню однойменного стовпця даного рядка таблиціDEPT. 11 Зверніть увагу на визначення стовпця DEPT_MNG - частина (6). Цей стовпецьоголошується зовнішнім ключем таблиці DEPT. Але ми хочемо сказати більше. У відділу можутьбути тимчасово відсутні керівники, тому в стовпці допускаються невизначені значення. Алеякщо у відділу є керівник, то він повинен бути керівником тільки цього відділу. На першийпогляд можна було б скористатися обмеженням стовпця UNIQUE. Але таке обмеженнядопускало б наявність невизначеного стовпця DEPT_MNG тільки в одному рядку таблиці DEPT, ами хочемо допустити відсутність керівника у кількох відділів. Тому треба було ввести більшгроміздке перевірочне обмеження стовпця.

З приводу двох наведених визначень базових таблиць можуть виникнути два питання:

чому перевірочне обмеження (9) у першому визначенні та перевірочні обмеження (7) і (8) удругому визначенні винесені з визначень відповідних стовпців, хоча формально є самеобмеженнями стовпців?чому обмеженню (9) у першому визначенні присвоєно явне ім’я, а обмеження (7) і (8) удругому визначенні залишені безіменними?

На перше питання можна відповісти таким чином. Так, ці обмеження можна було б включити ввизначення стовпців. Це справа смаку. Але всі три обмеження є дуже важливими з точки зору

Модель даних SQL 45

Page 46: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

організації таблиць в цілому. Тому краще показувати їх на рівні визначення табличних обмежень.Ось відповідь на друге питання. Обмеження (9) у першому визначенні та обмеження (7) і (8) у

другому визначенні зовні схожі, але сильно відрізняються за своєю суттю. Обмеження (7) і (8)пов’язані з агрегатної семантикою стовпців DEPT_EMP_NO і DEPT_TOTAL_SAL таблиці DEPT.Скасування обмежень змінило б зміст цих стовпців. Обмеження (9) є поточним адміністративнимобмеженням. Якщо керівництво підприємства прийме рішення дозволити використовувати водному проекті більше 50 службовців, обмеження можна скасувати без зміни сенсу стовпцівтаблиці EMP. Маючи це на увазі, ми ввели явне ім’я обмеження (9), щоб при необхідності маласяпроста можливість скасувати це обмеження за допомогою оператора ALTER TABLE.

Нарешті, визначимо таблицю PRO.(1) CREATE TABLE PRO ((2) PRO_NO PRO_NO PRIMARY KEY,(3) PRO_TITLE VARCHAR (200) DEFAULT ‘No title’ NOT NULL,(4) PRO_SDATE DATE DEFAULT CURRENT_DATE NOT NULL,(5) PRO_DURAT INTERVAL YEAR DEFAULT INTERVAL ‘1’ YEAR NOT NULL,(6) PRO_MNG EMP_NO UNIQUE NOT NULL REFERENCES EMP ON DELETE NO ACTION,(7) PRO_DESC CLOB (10M));

Стовпець PRO_SDATE містить дату початку проекту, а стовпець PRO_DURAT – тривалістьпроекту в роках. У цьому визначенні має сенс прокоментувати частину (6). Ми вважаємо, щоякщо відділ, принаймні тимчасово, може існувати без керівника, то у проекту завжди повиненбути менеджер. Тому визначення стовпця PRO_MNG є набагато більш суворим, ніж визначеннястовпця DEPT_MNG в таблиці DEPT. Поєднання обмежень UNIQUE і NOT NULL при відсутностізначень за замовчуванням призводить до абсолютної унікальності значень стовпця PRO_MNG.Іншими словами, цей стовпець володіє всіма характеристиками первинного ключа, хочаоголошений тільки як можливий ключ. Крім того, він оголошений як зовнішній ключ з дією привидаленні рядка таблиці EMP з відповідним значенням первинного ключа NO ACTION, забороннимтакі видалення. У сукупності це гарантує, що у будь-якого проекту буде існувати менеджер,який є службовцем підприємства. У частині (7) стовпець PRO_DESC (опис проекту) визначений яквеликий символьний об’єкт з максимальним розміром 10 Мбайт.

1.3.5. Зміна визначення базової таблиці.Оператор зміни визначення базової таблиці ALTER TABLE має наступний синтаксис:

base_table_alteration :: = ALTER TABLE base_table_name column_alteration_action | Base_table_constraint_alternation_action

Як видно з цього синтаксичного правила, при виконанні одного оператора ALTER TABLE можебути виконано або дію по зміні визначення стовпця, або дію по зміні визначення табличногообмеження цілісності.

Додавання, зміна або видалення визначення стовпцяДія по зміні визначення стовпця специфікується так:

column_alteration_action :: = ADD [COLUMN] column_definition | ALTER [COLUMN] column_name {SET default_definition | DROP DEFAULT} | DROP [COLUMN] column_name

{RESTRICT | CASCADE}Отже, з використанням оператора ALTER TABLE можна додавати до визначення таблиці

визначення нового стовпця (дія ADD) і змінювати або скасовувати визначення існуючогостовпця (дії ALTER і DROP відповідно).

Сенс дії ADD COLUMN майже повністю збігається зі змістом розділу визначення стовпця воператорі CREATE TABLE. Вказується ім’я нового стовпця, його тип даних або домен. Можутьвизначатися значення за замовчуванням і обмеження цілісності. Проте є одна суттєвавідмінність: стовпець, який визначається в дії ADD оператора ALTER TABLE, додається до вжеіснуючої таблиці, яка, швидше за все, містить деякий набір рядків. У кожному з існуючих рядківновий стовпець повинен містити деяке значення, і вважається, що відразу після виконання діїADD цим значенням є значення стовпця за замовчуванням. Тому стовпець, який визначається вдії ADD, обов’язково повинен мати значення за замовчуванням, тобто для нього недопустимаситуація, коли значенням за замовчуванням явно чи неявно оголошено невизначене значення(NULL), але серед обмежень цілісності стовпця присутній обмеження NOT NULL.

У дії ALTER COLUMN можна змінити (SET default_definition) або ліквідувати значення зазамовчуванням для існуючого стовпця. Правила визначення нового діючого значення стовпця зазамовчуванням збігаються з відповідними правилами, обговорювалися в підрозділі визначеннястовпця в операторі CREATE TABLE. Зауважимо, що зміна значення стовпця за замовчуванням не

Модель даних SQL 46

Page 47: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

впливає на стан існуючих рядків таблиці (навіть якщо в деяких з них зберігається попереднєзначення стовпця за замовчуванням). Якщо стовпець визначений на домені, у якого існуєзначення за умовчанням, то після скасування ухвали значення стовпця за замовчуванням дляцього стовпця починає діяти значення за замовчуванням домена.

Дія DROP COLUMN ліквідує існуючий стовпець (видаляє його з таблиці). Дія DROP COLUMNвідкидається, якщо:

зазначений стовпець є єдиним стовпцем таблиці;або в цій дії присутній специфікація RESTRICT, і даний стовпчик використовується увизначенні будь-яких уявлень чи обмежень цілісності

Якщо в дії присутній специфікація CASCADE, то його виконання породжує неявне виконанняоператора DROP для всіх уявлень і обмежень цілісності, у визначенні яких використовуєтьсяданий стовпець.Приклади зміни визначення стовпця

Припустимо, що на підприємстві ввели систему преміювання службовців. Кожен службовецьможе додатково до зарплати отримувати щомісячну премію, що не перевищує розмір йогозарплати. Тоді розумно додати до таблиці EMP новий стовпець EMP_BONUS, використовуючиоператор ALTER TABLE:

ALTER TABLE EMPADD EMP_BONUS SALARY DEFAULT NULLCONSTRAINT BONSAL CHECK (VALUE <EMP_SAL);

Зверніть увагу, що ми присвоїли перевірочному обмеженню стовпця явне ім’я, щоб у випадку,якщо обмеження на розмір премії зміняться (що цілком можливо), можна було б легко скасуватице обмеження, сприймаючи його як табличне.

При визначенні стовпця EMP_SAL таблиці EMP для цього стовпця явно не визначалосязначення за замовчуванням (воно наслідувалося з визначення домена). Якщо в якийсь момент цестало неправильним (наприклад, підвищився розмір мінімальної зарплати), можна встановитинове значення за замовчуванням:

ALTER TABLE EMP ALTER EMP_SAL SET DEFAULT 3000.00.При визначенні стовпця DEPT_TOTAL_SAL таблиці DEPT для нього було встановлено значення

за замовчуванням 1000000. Головний бухгалтер підприємства може бути незадоволений тим, щотакі важливі дані, як обсяг фонду зарплати відділів, можуть встановлюватися зазамовчуванням. Тоді можна скасувати це значення за замовчуванням:

ALTER TABLE DEPT ALTER DEPT_TOTAL_SAL DROP DEFAULT.Зверніть увагу, що після виконання цього оператора при вставці нового рядка в таблицю

DEPT завжди потрібно явно вказувати значення стовпця DEPT_TOTAL_SAL. Хоча формально устовпця буде існувати значення за умовчанням, успадковане від домену SALARY (3000.00), вононе може бути занесено в таблицю DEPT, оскільки суперечить обмеженню стовпцяDEPT_TOTAL_SAL CHECK (VALUE> = 100000.00).

Зміна набору табличних обмежень. Дія по зміні набору табличних обмежень специфікується так:

base_table_constraint_alternation_action :: = ADD [CONSTRAINT] base_table_constraint_definition | DROP CONSTRAINT

constraint_name {RESTRICT | CASCADE}

Дія ADD [CONSTRAINT] дозволяє додати до набору існуючих обмежень таблиці новеобмеження цілісності. Можна вважати, що нове обмеження додається через AND до кон’юнкціїіснуючих обмежень, як якби воно визначалося у складі оператора CREATE TABLE. Але тут є однаістотна відмінність. Якщо уважно подивитися на всі можливі види табличних обмежень, можнапереконатися, що будь-яке з них задовольняється на порожній таблиці. Тому, який би набіртабличних обмежень ні був визначений при створенні таблиці, це визначення є допустимим і неперешкоджає виконанню оператора CREATE TABLE. При додаванні нового табличногообмеження з використанням дії ADD [CONSTRAINT] ми маємо іншу ситуацію, оскільки таблиця,швидше за все, вже містить деякий набір рядків, для якого умовний вираз нового обмеженняможе прийняти значення false. У цьому разі виконання оператора ALTER TABLE, що включає діюADD [CONSTRAINT], відкидається.

Виконання дії DROP CONSTRAINT призводить до ліквідації існуючого табличного обмеження.Можна ліквідувати тільки іменовані табличні обмеження. Специфікації RESTRICT і CASCADEосмислені т ільки в тому випадку, якщо скасовується обмеження є обмеженням можливогоключа (UNIQUE або PRIMARY KEY). При вказівці RESTRICT дію відкидається, якщо на даний

Модель даних SQL 47

Page 48: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

можливий ключ посилається хоча б один зовнішній ключ. При вказівці CASCADE дія DROPCONSTRAINT виконується в будь-якому випадку, і всі визначення таких зовнішніх ключів такожскасовуються.Приклади зміни набору табличних обмежень

Нагадаємо, що ми додали до таблиці EMP стовпець EMP_BONUS, в якому зберігаютьсярозміри щомісячних премій службовців. Припустимо, що премії виплачуються з фонду заробітноїплати відділу, в якому працює службовець. Тоді перевірочне обмеження стовпцяDEPT_TOTAL_SAL, яке встановлює, що обсяг фонду зарплати відділу не повинен бути меншесумарної зарплати службовців цього відділу, стає недостатнім, і нам потрібно додати до наборуобмежень таблиці DEPT нове обмеження:

ALTER TABLE DEPT ADD CONSTRAINT TOTAL_INCOMECHECK (DEPT_TOTAL_SAL> = (SELECT SUM (EMP_SAL + COALESCE (EMP_BONUS, 0))FROM EMP WHERE EMP.DEPT_NO = DEPT_NO)).

Хоча це обмеження на вигляд досить складне, сенс його дуже простий: сумарний дохідслужбовців відділу не повинен перевищувати обсяг зарплати відділу. У арифметичному виразіпід знаком агрегатної операції SUM використовується операція COALESCE. Ця двомісна операціявизначається наступним чином:

COALESCE (x, y) IF x IS NOT NULL THEN x ELSE y,тобто значенням операції є значення першого операнда, якщо воно не дорівнює NULL, і

значення другого операнда – в іншому випадку. Нам довелося скористатися цією операцією,оскільки в стовпці EMP_BONUS допускається наявність невизначених значень.

При визначенні таблиці EMP було специфіковане перевірочне табличне обмеженняPRO_EMP_NO, яке встановлює, що над одним проектом не повинно працювати більш 50службовців. Ми вже відзначали, що це обмеження носить суто адміністративний характер іможе бути скасована без порушення логіки бази даних. Для скасування обмеження потрібновиконати наступний оператор:

ALTER TABLE EMP DROP CONSTRAINT PRO_EMP_NO;

1.3.6. Видалення базової таблиці. Для видалення (знищення) базової таблиці служить оператор DROP TABLE, що задається внаступному синтаксисі:

DROP TABLE base_table_name {RESTRICT | CASCADE}Успішне виконання оператора призводить до того, що зазначена базова таблиця перестає

існувати. Знищуються всі її рядки, визначення стовпців і табличні визначення цілісності. Принаявності специфікації RESTRICT виконання оператора DROP TABLE відкидається, якщо ім’ятаблиці використовується в якомусь визначенні подання або обмеження цілісності. Принаявності специфікації CASCADE оператор виконується в будь-якому випадку, і всі визначенняуявлень і обмежень цілісності, які містять посилання на дану таблицю, також скасовуються.

1.4 Засоби визначення та скасування загальних обмежень цілісностіВиди обмежень цілісності, з якими ми мали справу в попередніх розділах цієї теми, утворюютьієрархію (рис. 2.3).

Модель даних SQL 48

Page 49: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Рисунок 2.3 – Ієрархія видів обмежень цілісностіОбмеження цілісності, що входять у визначення домену, успадковуються всіма стовпцями,

визначеними на цих доменах, і є обмеженнями цих стовпців. Крім того, у визначення стовпцяможуть входити визначення додаткових обмежень. Обмеження цілісності, що входять увизначення стовпця (включаючи обмеження, успадковані з визначення домена), є обмеженнямитаблиці, до складу визначення якої входить визначення даного стовпця. Крім того, увизначення таблиці можуть входити визначення додаткових обмежень.

Але ієрархія видів обмежень цілісності цим не вичерпується. Обмеження цілісності, щовходять у визначення таблиці (включаючи явні і успадковані від визначення доменів обмеженнястовпців), являють собою обмеження бази даних, частиною якої є дана таблиця. Крім того,можуть визначатися додаткові обмеження бази даних. У стандарті SQL такі додатковіобмеження бази даних називаються ASSERTION, а ми їх будемо називати загальнимиобмеженнями цілісності.

1.4.1. Визначення загальних обмежень цілісності.Для визначення загального обмеження цілісності служить оператор CREATE ASSERTION, щозадається в наступному синтаксисі:

CREATE ASSERTION constraint_name CHECK (conditional_expression)Зауважимо, що при створенні загального обмеження цілісності його ім’я завжди має

зазначатися явно. Хоча синтаксис визначення загального обмеження збігається з синтаксисомвизначень обмежень стовпця і таблиці, в даному випадку допускаються тільки спеціальні видиумовних виразів. Якщо говорити неформально, то особливі властивості умов пов’язані з тим, щопри визначенні загальних обмежень цілісності контекстом, в якому обчислюється умовний вираз,є весь набір таблиць бази даних, а не набір рядків таблиці, як це було при визначенні табличнихобмежень.

Продемонструємо і прокоментуємо кілька прикладів визначень загальних обмеженьцілісності.

У визначенні таблиці EMP містилося обмеження стовпця EMP_BDATE:CHECK (EMP_BDATE> = ‘1917-10-24’)

(до роботи на підприємстві допускаються тільки ті особи, які народилися після Жовтневогоперевороту). Ось яким чином можна визначити таке ж обмеження на рівні загальних обмеженьцілісності:

CREATE ASSERTION MIN_EMP_BDATE CHECK (((SELECT MIN (EMP_BDATE)) FROM EMP)> = ‘1917-10-24’)

У логічній умові цього загального обмеження вибирається мінімальне значення стовпцяEMP_BDATE (дата народження найстарішого службовця). Значенням умовного виразу буде falseв тому і т ільки в тому випадку, якщо серед службовців є хоча б один, що народився до вказаноїдати.

Тепер формулюємо у вигляді загального обмеження цілісності обмеження таблиці EMPPRO_EMP_NO, яке визначалося наступним чином:

CONSTRAINT PRO_EMP_NO CHECK ((SELECT COUNT (*) FROM EMP E WHERE E.PRO_NO = PRO_NO) <= 50)

(над одним проектом не може працювати більше 50 службовців).Ось формулювання еквівалентного загального обмеження цілісності:

CREATE ASSERTION NEW_PRO_EMP_NO CHECK (NOT EXISTS (SELECT PRO_NO FROM EMP GROUP BY PRO_NO HAVING COUNT (*)> 50)).

Логічний вираз цього обмеження може приймати тільки значення true і false. Внутрішнійоператор вибірки групує рядки таблиці EMP таким чином, що в одну групу потрапляють всірядки з однаковим значенням стовпця PRO_NO. Потім ці групи фільтруються за умовою розділуHAVING, і залишаються тільки групи, що включають більше 50 рядків. У результуючій таблицімістяться рядки з одного стовпця, що містить значення PRO_NO. Предикат NOT EXISTS приймаєзначення true тоді і т ільки тоді, коли ця результуюча таблиця не містить жодного рядка, тобтонемає жодного проекту, в якому працює більше 50 службовців.

Покажемо, як можна сформулювати у вигляді загального обмеження цілісності обмеженнязовнішнього ключа. Наприклад, наведемо таку еквівалентну формулювання для визначеннязовнішнього ключа PRO_NO, що входить до складу визначення таблиці EMP:

FOREIGN KEY PRO_NO REFERENCES PRO (PRO_NO)У вигляді загального обмеження цілісності це може виглядати наступним чином:

(1) CREATE ASSERTION FK_PRO_NO CHECK(2) (NOT EXISTS (SELECT * FROM EMP

Модель даних SQL 49

Page 50: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

WHERE PRO_NO IS NOT NULL AND(3) NOT EXISTS (SELECT * FROM PRO(4) WHERE PRO.PRO_NO = EMP.PRO_NO))).

Пояснимо логічний вираз цього обмеження. Умова вибірки оператора SELECT на рядку (2)складається з двох частин, пов’язаних через AND. Перша частина відфільтровує ті рядкитаблиці EMP, у яких в стовпці PRO_NO міститься NULL. Якщо цей стовпець містить NULL у всіхрядках таблиці, то результуюча таблиця оператора вибірки на рядку (2) буде порожня, ізначенням предиката NOT EXISTS буде true, тобто обмеження задовольняється.

Тепер припустимо, що в таблиці EMP знайшлася рядок emp, у стовпці PRO_NO якій міститьсязначення, відмінне від NULL. Назвемо це значення cand_pro_no. Для нього обчислюється другачастина умови вибірки оператора SELECT на рядку (2). Оператор вибірки на рядку (3) вибирає всірядки таблиці PRO, значення стовпця PRO_NO яких дорівнює cand_pro_no. Якщо для даногозначення cand_pro_no знайшлася хоча б одна така рядок, то результуюча таблиця операторавибірки на рядку (3) буде непорожній, і значенням предиката NOT EXISTS на рядку (3) буде false.Відповідно, всі умова вибірки першого оператора SELECT прийме значення false, і рядок зізначенням cand_pro_no в стовпці PRO_NO буде відфільтрована.

Якщо ж знайдеться хоча б один рядок таблиці EMP з таким значенням cand_pro_no стовпцяPRO_NO, що в таблиці PRO бракуватиме жодного рядка, значення стовпця PRO_NO якоїдорівнювало б цьому cand_pro_no, то результуюча таблиця оператора вибірки на рядку (3) будепорожня, і значенням предиката NOT EXISTS на рядку (3) буде true. Тоді вся умова вибіркипершого оператора SELECT прийме значення true, і цей рядок таблиці EMP буде пропущений врезультуючу таблицю. Значенням предиката NOT EXISTS буде false, тобто обмеження незадовольняється.

1.4.2. Видалення загального обмеження цілісності.Для того щоб скасувати раніше визначене загальне обмеження цілісності, потрібноскористатися оператором DROP ASSERTION, заданим в такому синтаксисі:

DROP ASSERTION constraint_nameОсь приклад оператора, що скасовує визначення дискримінаційного загального обмеженняцілісності PRO_MNG_CONSTR:

DROP ASSERTION PRO_MNG_CONSTR;

1.4.3. Негайна і відкладена перевірка обмежень.На перший погляд здається, що обмеження цілісності (всіх видів) повинні негайно перевірятися уразі виконання будь-якої дії, що змінює вміст бази даних (вставка в будь-яку таблицю новогорядка, зміна або видалення існуючих рядків). Однак можна визначити такі обмеження цілісності,логічний вираз яких прийматиме значення false при негайній перевірці. Одним із прикладівтакого обмеження є обмеження

CHECK (DEPT_EMP_NO = (SELECT COUNT (*) FROM EMP WHERE DEPT_NO = EMP.DEPT_NO))

з визначення таблиці DEPT. Припустимо, наприклад, що у відділ зараховується новийслужбовець. Тоді потрібно виконати дві операції: (a) вставити новий рядок в таблицю EMP і (b)змінити відповідний рядок таблиці DEPT (додати одиницю до значення стовпця DEPT_EMP_NO).Очевидно, що в якому б порядку ні виконувалися ці операції, одразу після виконання першої зних обмеження цілісності буде порушено, відповідну дію буде відкинуто, і ми ніколи не зможемоприйняти на роботу нового службовця.

Оскільки обмеження цілісності, негайна перевірка яких безглузда, є потрібними і корисними, вмову SQL включені засоби, що дозволяють регулювати час перевірки обмежень. Якщо говоритибільш точно, в контексті кожної виконуваної транзакції кожне обмеження цілісності повиннознаходитися в одному з двох режимів: режимі негайної перевірки (immediate) або режимівідкладеної перевірки (deferred). Всі обмеження цілісності, що знаходяться в режимі негайноїперевірки, перевіряються при виконанні в транзакції будь-якої операції, що змінює стан базиданих. Якщо дія операції порушує якесь обмеження цілісності, що негайно перевіряється, то цядія відкидається. Обмеження цілісності, що знаходяться в режимі відкладеної перевірки,перевіряються при завершенні транзакції (виконанні операції COMMIT). Якщо дії цієї транзакціїпорушують якесь відкладене обмеження цілісності, то транзакція відкочується (операціяCOMMIT трактується як операція ROLLBACK).

Для цього в якості заключної синтаксичної конструкції до будь-якого визначення обмеженняцілісності (будь-якого виду) може бути додана специфікація INITIALLY в наступній синтаксичної

Модель даних SQL 50

Page 51: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

формі:INITIALLY {DEFERRED | IMMEDIATE} [[NOT] DEFERRABLE]

Ця специфікація вказує, в якому режимі повинно знаходитися дане обмеження цілісності напочатку виконання будь-якої транзакції (INITIALLY IMMEDIATE означає, що на початку виконаннятранзакції дане обмеження буде знаходитися в режимі негайної перевірки, а INITIALLY DEFERRED– що на початку будь-якої транзакції обмеження буде знаходитися в режимі відкладеноїперевірки), а також можливості зміни режиму цього обмеження при виконанні транзакції(DEFERRABLE означає, що для даного обмеження може бути встановлений режим відкладеноїперевірки, а NOT DEFERRABLE – що не може).

Комбінація INITIALLY DEFERRED NOT DEFERRABLE є неприпустимою. Якщо у визначенніобмеження специфікація початкового режиму перевірки відсутня, то мається на увазі наявністьспецифікації INITIALLY IMMEDIATE. При наявності явної або неявної специфікації INITIALLY IMMEDIATEі відсутності явної вказівки можливості зміни режиму мається на увазі наявність специфікаціїNOT DEFERRABLE. При наявності специфікації INITIALLY DEFERRED і відсутності явної вказівкиможливості зміни режиму мається на увазі наявність специфікації DEFERRABLE.

При виконанні транзакції можна змінити режим перевірки деяких або всіх обмежень цілісностідля даної транзакції. Для цього використовується оператор SET CONSTRAINTS, що задається внаступному синтаксисі:

SET CONSTRAINTS {constraint_name_commalist | ALL} {DEFERRED | IMMEDIATE}Якщо в операторі вказується список імен обмежень цілісності, то всі вони повинні бути

DEFERRABLE; якщо хоча б для одного обмеження зі списку ця вимога не виконується, то операціяSET CONSTRAINTS відкидається. При вказівці ключового слова ALL режим встановлюється длявсіх обмежень, у визначенні яких явно чи неявно було вказано DEFERRABLE. Якщо в якостібажаного режиму перевірки обмежень задано DEFERRED, то всі зазначені обмеженняпереводяться в режим відкладеної перевірки. Якщо в якості бажаного режиму перевіркиобмежень задано IMMEDIATE, то всі зазначені обмеження переводяться в режим негайноїперевірки. При цьому якщо хоча б одне з цих обмежень не задовольняється, то операція SETCONSTRAINTS відкидається, і всі зазначені обмеження залишаються в попередньому режимі.

При виконанні операції COMMIT неявно виконується операція SET CONSTRAINTS ALL IMMEDIATE.Якщо ця операція відкидається, то COMMIT спрацьовує як ROLLBACK.

ВисновкиВ цій лекції ми почали розглядати засоби мови SQL визначення та динамічної зміни схеми базиданих. В останніх стандартах мови SQL підтримуються:

розвинений набір напердвизначених типів, включно з рядом параметризованих типів;генератори типів масивів та мультимножин, елементами яких можуть бути значеннянапередвизначених типів, типів колекцій, анонімних рядкових типів та типів, визначнихкористувачем;генератор анонімних рядкових типів, в яких типом елемента рядка може бути будь-який напередвизначений тип, тип колекцій, анонімний рядковий тип та тип, визначенихкористувачем;визначений користувачем структурований тип, в якому типом елемента структури можебут и бути будь-який напередвизначений тип, тип колекцій, анонімний рядковий тип татип, визначних користувачем;для визначених користувачем структурних та індивідуальних типів можна визначатикористувальницькі операції.

Тема 3 Засоби маніпулювання даними мови3.1 Базові засоби маніпулювання даними

Оператор INSERT для вставки рядків в існуючі таблиціЗагальний синтаксис оператора INSERTВставка явно заданого набору рядківВставка рядків результату запиту

Оператор UPDATE для модифікації існуючих рядків в існуючих таблицяхЗагальний синтаксис оператора UPDATE

Оператор DELETE для видалення рядків в існуючих таблицяхПодання, над якими можливі операції оновленняКритерії можливості застосування операцій оновлення

3.2 Правила функціональної залежностіОсновні визначення та поняттяРозділ WITH CHECK OPTION визначення уявленняРежими перевірки CASCADED і LOCAL

Модель даних SQL 51

Page 52: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

3.3 Операції оновлення баз даних і механізм тригерівПоняття тригера в SQL: 1999Синтаксис визначення тригерів і типи тригерів

Тригери BEFORE і AFTERТригери INSERT, UPDATE і DELETEТригери ROW і STATEMENTРозділ WHENТіло тригераВиконання тригерівМожливості використання старих і нових значеньОбробка декількох тригерів, пов’язаних з однієї предметної таблицею

Висновки

ТЕМА 3 ЗАСОБИ МАНІПУЛЮВАННЯ ДАНИМИ МОВИ

3.1 Базові засоби маніпулювання данимиДо базових засобів маніпулювання даними мови SQL відносяться "пошукові" варіанти операторівUPDATE і DELETE. Ці варіанти називаються пошуковими, бо при завданні відповідної операціїзадається логічна умова, що накладається на рядки адресуемої оператором таблиці, які повиннібути модифіковані або видалені. Крім того, в таку категорію мовних засобів входить операторINSERT, що дозволяє додавати рядки в існуючі таблиці.

Оператор INSERT для вставки рядків в існуючі таблиці

Загальний синтаксис оператора INSERT

INSERT INTO table_name{[(Column_commalist)] query_expression | DEFAULT VALUES

Обмежимось найпростішою складовою конструкції query_expression (simple_table), ми маємотакі можливості:

simple_table :: = query_specification| Table_value_constructor | TABLE table_name

Стандарт допускає вставку в зазначену таблицю всіх рядків деякої іншої таблиці (варіантtable_name). Ця інша таблиця може бути як базовою, так і віртуальним поданням. Природно, щов останньому випадку у визначенні подання не повинні бути присутніми посилання на таблицю, вяку виконується вставка. При використанні даного варіанту оператора вставки число стовпцівтаблиці, що вставляється, має збігатися з числом стовпців таблиці, в яку виконується вставка,або з числом стовпців, зазначених у списку column_commalist, якщо цей список заданий. Типиданих відповідних стовпців таблиці, що вставляється, і таблиці, в яку проводиться вставка,повинні бути сумісними. Якщо в операції наведено список column_commalist і в ньому містятьсяне всі імена стовпців таблиці, в яку проводиться вставка, то в незаначені стовпці у всіх рядкахзаносяться значення за замовченням. Якщо для будь-якого з решти стовпців значення зазамовчуванням не визначено, при виконанні операції вставки фіксується помилка.Щоб навести приклад цього варіанту операції INSERT, припустимо, що в базі даних EMP-DEPT-PROє ще одна проміжна таблиця EMP_TEMP, в якій тимчасово зберігаються дані про службовців, щопроходять випробувальний термін. Нехай ця таблиця має такий заголовок:

EMP_TEMP:EMP_NO: EMP_NOEMP_NAME: VARCHAREMP_BDATE: DATE

У таблиці EMP_TEMP зберігаються не повні відомості про службовців, а саме ті, які потрібні начас випробувального терміну. Якщо виконати операцію

INSERT INTO EMP (EMP_NO, EMP_NAME, EMP_BDATE) TABLE EMP_TEMP;то в основній таблиці EMP з’являться рядки, відповідні співробітникам, котрі проходили

випробувальний термін. При цьому в стовпцях EMP_NO, EMP_NAME, EMP_BDATE цих рядків будутьміститися дані, взяті з таблиці EMP_TEMP, а в стовпцях EMP_SAL, DEPT_NO, PRO_NOзнаходитимуться значення, визначені для даних стовпців за замовченням. Звичайно, оскільки

Модель даних SQL 52

Page 53: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

стовпець EMP_NO є первинним ключем таблиці EMP (логічно, і таблиці EMP_TEMP), операціявставки буде успішно виконана тільки в тому випадку, коли обмеження первинного ключатаблиці EMP не буде порушено.

Вставка явно заданого набору рядківТепер звернемося до варіанту оператора INSERT, в якому набір рядків, що вставляютьсязадається явно з використанням синтаксичної конструкції table_value_constructor. Нагадаємосинтаксичні правила, що визначають цю конструкцію:

table_value_constructor :: =VALUES row_value_constructor_comma_list

row_value_constructor :: = row_value_constructor_element| [ROW] (row_value_constructor_element_comma_list)| Row_subquery row_value_constructor_element :: = value_expression| NULL | DEFAULT

Найпростіший приклад використання цього варіанту оператора вставки полягає в занесенні втаблицю EMP явно задаються даних про нового співробітника:

INSERT INTO EMPROW (2445, ‘Brown’, ‘1985-04-08’, 16500.00, 630, 772);

У цьому прикладі явно задані значення всіх стовпців нових рядків (як показують синтаксичніправила, ключове слово ROW можна опустити). Можливий і такий варіант:

INSERT INTO EMPROW (2445, DEFAULT, NULL, DEFAULT, NULL, NULL);

У цьому випадку ми знаємо про нового службовця дуже мало, але впевнені в тому, що йогоім’я і розмір заробітної плати повинні бути призначені за замовченням, а про дату народження,номер відділу і номер проекту нічого не відомо.

Якщо володіти повною інформацією про визначення таблиці EMP, то формулювання операціїпопереднього прикладу можна переписати коротше:

INSERT INTO EMP (EMP_NO) 2445;Згадаймо тепер, що одним із різновидів value_expression_primary є scalar_subquery. Це означає,

що в список елементів конструктора рядків можуть входити скалярні запити, тобто запити,результат виконання яких складається з єдиного рядка, що включає єдиний стовпець. Томудопустима, наприклад, така операція вставки:

INSERT INTO EMP VALUESROW (2445, (SELECT EMP_NAME FROM EMP WHERE EMP_NO = 2 555),’1985-04-08’,SELECT EMP_SAL FROM EMP WHERE EMP_NO = 2 555),NULL, NULL),ROW (2446, (SELECT EMP_NAME FROM EMP WHERE EMP_NO = 2556),’1978-05-09’,(SELECT EMP_SAL FROM EMP WHERE EMP_NO = 2556),NULL, NULL);

Після виконання цієї операції в таблиці EMP з’являться два нові рядки для співробітників з

унікальними ідентифікаторами +2445 і +2446, причому першому з них буде присвоєно ім’я і розмірзаробітної плати співробітника з унікальним ідентифікатором +2555, а другому – аналогічні даніпро співробітника з унікальним ідентифікатором +2556

Вставка рядків результату запитуОбговоримо варіант оператора вставки, коли набір рядків, що вставляються визначаєтьсячерез специфікацію запиту. Припустимо, наприклад, що потрібно зберегти в окремій таблиціDEPT_SUMMARY відомості про число співробітників кожного відділу, їх максимальної, мінімальної ісумарною заробітній платі. Нехай таблиця DEPT_SUMMARY вже створена і має такий зоголовок):

DEPT_SUMMARY:DEPT_NO: DEPT_NODEPT_EMP_NO: INTEGERDEPT_MAX_SAL: SALARYDEPT_MIN_SAL: SALARY

Модель даних SQL 53

Page 54: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

DEPT_TOTAL_SAL: SALARYТоді заповнити таблицю можна за допомогою такої операції вставки:

INSERT INTO DEPT_SUMMARY(SELECT DEPT_NO, COUNT (*), MAX (EMP_SAL),MIN (EMP_SAL), SUM (EMP_SAL)FROM EMPGROUP BY DEPT_NO);

Оператор UPDATE для модифікації існуючих рядків в існуючих таблицях

Загальний синтаксис оператора UPDATE

UPDATE table_name SET update_assignment_commalistWHERE conditional_expression update_assignment:: =column_name={Value_expression|DEFAULT|NULL}

Семантика оператора модифікації існуючих рядків визначається так:

для всіх рядків таблиці з ім’ям table_name обчислюється булевский виразconditional_expression. Рядки, для яких значенням цього булевского виразу є true,вважаються такими, що підлягають модифікації (позначимо Множина таких рядків черезTm);кожен рядок s (s Tm) піддається модифікації таким чином, що значення кожногостовпчика цього рядки, зазначеного в списку update_assignment_commalist, замінюєтьсязначенням, зазначеним у правій частині відповідного елемента спіска модіфікаціі).Значення стовпців рядка s, не зазначені в списку модифікації, залишаються незмінними.

Наведемо приклади операцій модифікації таблиць.Перевести всіх службовців, що виконують проект з номером 772, у відділ 632 і підвищити їм

заробітну плату на 1000 грн.UPDATE EMP SET DEPT_NO = 632, EMP_SAL = EMP_SAL + 1000.00WHERE PRO_NO = 772;

При виконанні даної операції на першому кроці в таблиці EMP будуть знайдені всі рядки, якістосуються службовців, які беруть участь у проекті з номером 772. На другому кроці в усіх цихрядках значення стовпця DEPT_NO буде змінено на 632, а до значення стовпця EMP_SAL будедодано 1000.00 .

Для всіх службовців, які працюють у відділах, заробітна плата менеджерів яких перевищує30000 грн, Встановити розмір заробітної плати, на 1000 грн перевищує середній розмірзаробітної плати відповідного відділу, а номери проектів, в яких беруть участь ці службовці,зробити невизначеними:

UPDATE EMP SET EMP_SAL = (SELECT AVG (EMP1_SAL)FROM EMP EMP1 WHERE EMP.DEPT_NO = EMP1.DEPT_NO)+ 1000.00, PRO_NO = NULLWHERE (SELECT EMP1.EMP_SALFROM EMP EMP1, DEPTWHERE EMP.DEPT_NO = DEPT.DEPT_NOAND DEPT_MNG = EMP1.EMP_NO AND)> 30000.00;

Ці приклади дозволяють зрозуміти, наскільки багаті можливості оператора UPDATE. У розділіWHERE може міститися будь-яка умова, що допускається в операторі вибірки, а в елементахсписку розділу SET може бути присутнім будь-який вид value_expression, у тому числі будь-якийскалярний підзапит.

Оператор DELETE для видалення рядків в існуючих таблицяхЗагальний синтаксис оператора DELETE виглядає наступним чином:

DELETE FROM table_nameWHERE conditional_expression

У певному сенсі оператор DELETE є окремим випадком оператора UPDATE (або, навпаки, дія

Модель даних SQL 54

Page 55: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

оператора UPDATE являє собою комбінацію дій операторів DELETE і INSERT).Семантика оператора модифікації існуючих рядків визначається так:

для всіх рядків таблиці з ім’ям table_name обчислюється булевський виразconditional_expression. Рядки, для яких значенням цього булевского вираження є true,вважаються такими, що підлягають видаленню (позначимо Множина таких рядків черезTd);кожен рядок s (s Td) видаляється з зазначеної таблиці.

З метою ілюстрації наведемо два приклади операції видалення рядків.Видалити з таблиці EMP всі рядки, які стосуються службовцям, які беруть участь у проекті з

номером 772:DELETE FROM EMP WHERE PRO_NO = 772;

Видалити з таблиці EMP всі рядки, які стосуються службовців, розмір заробітної плати якихперевищує розмір заробітної плати менеджерів їх відділів.

DELETE FROM EMP WHERE EMP_SAL>(SELECT EMP1.EMP_SALFROM EMP EMP1, DEPTWHERE EMP.DEPT_NO = DEPT.DEPT_NOAND DEPT.DEPT.MNG = EMP1.EMP_NO);

Як і в операторі UPDATE, в розділі WHERE оператора DELETE можна використовувати будь-який вид булевского виразу, допустимого в операторі вибірки. Тому можливості операторавидалення рядків обмежені лише фантазією користувача.

Подання, над якими можливі операції оновленняПодання – це зберігаємий в каталозі бази даних результат запитів, що володіє власним ім’ям і,можливо, власними іменами стовпців. Для зручності повторимо синтаксичні правила визначенняподання:

create_view :: = CREATE [RECURSIVE] VIEW table_name[Column_name_comma_list]AS query_expression[WITH [CASCADED | LOCAL] CHECK OPTION]

В операціях вибірки до будь-якого поданням можна адресуватися таким же чином, як і добудь-якої базової таблиці. Природно, виникає питання: а чи можна застосувати імена подань і вопераціях оновлення бази даних і якщо така можливість допускається, то як це слід розуміти?

Нагадаємо, що відповідно до семантики мови SQL при виконанні запиту, в розділі FROM якомупрямо або непрямо присутнє ім’я подання, насамперед, проводиться матеріалізація уявлення,тобто обчислюється результат відповідного виразу запитів, зберігається в тимчасовій базовійтаблиці, і далі запит виконується по відношенню до цієї базової таблиці.

Якщо допустити виконання над поданнями операцій оновлення (відразу зауважимо, що,взагалі кажучи, в мові SQL це завжди дозволялося), то в цьому випадку семантикаматеріалізації явно не підходить. На перше місце виходить вимога, щоб операція оновлення надподанням однозначно відображалася в одну або кілька операцій оновлення над тими постійнозбереженими базовими таблицями, над якими прямо або побічно визначено дане подання.

Оскільки базовим елементом виразів запитів є специфікація запиту, насамперед потрібнозрозуміти, який клас специфікацій запитів є допускає операції оновлення (термін updatable –оновлюваний, використовуваний в стандарті SQL, здається не дуже вдалим в російськійваріанті). У стандарті SQL/92 специфікація запиту допускає операції оновлення в тому і т ільки втому випадку, коли виконуються такі умови:

в розділі SELECT специфікації запиту відсутня ключове слово DISTINCT (тобто не потрібневидалення рядків-дублікатів з результату запиту);всі елементи списку вибірки розділу SELECT є іменами стовпців, і жодне ім’я стовпця незустрічається в цьому списку більше одного разу;в розділі FROM присутній тільки одне посилання на таблицю, і вона вказує або на базовутаблицю, або на породжувану таблицю, яка допускає операції оновлення;прямі або непрямі посилання на базову таблицю, прямо або побічно ідентифікованупосиланням на таблицю в розділі FROM, не зустрічаються в розділі FROM жодногопідзапиту, що бере участь в розділі WHERE специфікації запиту;в специфікації запиту відсутні розділи GROUP BY і HAVING.

Модель даних SQL 55

Page 56: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Неважко переконатися в тому, що ці вимоги є достатніми для однозначної інтерпретаціїоперацій оновлення над поданнями. Наприклад:

SELECT EMP_SALFROM (SELECT EMP_SAL, DEPT_NOFROM EMPWHERE EMP_NAME = (SELECT EMP_NAMEFROM EMP WHERE EMP_NO = 4425))WHERE DEPT_NO <> 630;

Цю специфікацію можна спростити до еквівалентного синтаксису:

SELECT EMP_SALFROM EMP WHERE EMP_NAME = (SELECT EMP_NAMEFROM EMP WHERE EMP_NO = 4425)AND DEPT_NO <> 630;

Припустимо, що з даною специфікацією запиту пов’язано подання з ім’ям EMPSAL. Тоді

операція

UPDATE EMPSAL SET EMP_SAL = EMP_SAL - 1000.00; еквівалентна операції

UPDATE EMP SET EMP_SAL = EMP_SAL - 1000.00WHERE EMP_NAME = (SELECT EMP_NAMEFROM EMP WHERE EMP_NO = 4425)AND DEPT_NO <> 630;

Операція

DELETE FROM EMPSAL WHERE EMP_SAL> 20000.00;

еквівалентна операції

DELETE EMPSALWHERE EMP_SAL> 20000.00 ANDEMP_NAME = (SELECT EMP_NAMEFROM EMPWHERE EMP_NO = 4425)AND DEPT_NO <> 630;

Операція вставки над виставою EMPSAL

INSERT INTO EMPSAL 25000.00;трактується як

INSERT INTO EMP ROW(DEFAULT, DEFAULT, DEFAULT, 25000.00, DEFAULT, DEFAULT);

Зрозуміло, що така операція буде відкинута системою, тому що для стовпця EMP_NO таблиці

EMP значення за замовчуванням не визначені (це первинний ключ таблиці, значення якогоповинні явно задаватися в будь-якої операції вставки).

Критерії можливості застосування операцій оновленняДо специфікації запиту потенціально можна застосовувати операції оновлення в тому і т ільки втому випадку, коли виконуються такі умови:

в розділі SELECT специфікації запиту відсутнє ключове слово DISTINCT;елемент списку вибірки розділу SELECT, що складається із посилання на деякий стовпець,не може бути присутнім у цьому списку більше одного разу;в специфікації запиту відсутні розділи GROUP BY і HAVING.

Якщо вираз запитів відповідає умовам потенціального застосування операцій оновлення і в йогорозділі FROM присутнє тільки одне посилання на таблицю, то до кожного стовпця виразу

Модель даних SQL 56

Page 57: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

запиту, відповідному одному стовпцю таблиці з розділу FROM, можуть бути застосовані операціїоновлення. Якщо вираз запиту відповідає умовам потенційного застосування операційоновлення, але в його розділі FROM присутні два або більше посилання на таблиці, то операціїоновлення застосовуються до стовпців виразу запитів тільки при виконанні таких умов:

стовпець породжується зі стовпця тільки однієї таблиці з розділу FROM;ця таблиця використовується у виразі запитів таким чином, що зберігаються властивостіїї первинного та всіх можливих ключів.

Іншими словами, до стовпця таблиці, яка відповідає умовам потенціального застосуванняоперацій оновлення, застосовуютсья операції оновлення тільки в тому випадку, коли цейстовпець може бути однозначно зіставлений з єдиним стовпцем єдиної таблиці, що бере участьу виразі запиту, і кожен рядок виразу запиту може бути однозначно зіставлений з єдинимрядком даної таблиці.

Вираз запитів задовольняє умові застосування операцій оновлення, якщо принаймні до одногостовпця виразу запитів можуть бути застосовані операції оновлення. Вираз запитів задовольняєумові простого застосування операцій оновлення, якщо в розділі FROM вираз запитів міститьпосилання тільки на одну таблицю, і всі стовпці виразу запитів задовольняють умовізастосування операцій оновлення.

Вираз запитів задовольняє умові застосування операцій вставки, якщо він задовольняє умовізастосування операцій оновлення; кожна з таблиць, від яких залежить цей вираз (тобтотаблиць, на які є посилання в розділі FROM), задовольняє умові застосування операцій вставки івираз запитів не містить операцій UNION, INTERSECT і EXCEPT. Звичайно, це визначення базуєтьсяна тому факті , що для будь-якої базової таблиці умова застосування операції вставкизадовольняється.

3.2 Правила функціональної залежності

Основні визначення та поняттяНаведемо кілька додаткових визначень, необхідних для розуміння підходу, щовикористовується в SQL: 1 999.

Нехай S позначає деяку множину стовпців таблиці T, а SS позначає деяку підмножину S(SS S). Тоді по першій аксіомі Армстронга SSS. У термінології SQL: +1999 ця FD називаєтьсяаксіоматичною. Всі ФЗ, які не є аксіоматичними, називаються неаксіоматичними.Всі аксіоматичні FD є відомими FD. У стандарті визначаються правила визначення іншихвідомих FD. Крім того, стандарт залишає свободу для реалізацій SQL в доповненні цієїсистеми правил з метою знаходження відомих FD, що не специфіковані в стандарті.Якщо деякий стовпець C1 віртуальної таблиці T1 (породжуваної таблиці або подання)визначається шляхом посилання на стовпець C2 деякої іншої (базової або віртуальної)таблиці T2, на основі якої породжується T1, то C1 є двійником C2. Більш точно, C1 єдвійником C2 відповідно до таблиці T2.Поняття двійників розширюється на множини стовпців. Якщо деяка множина стовпців S1віртуальної таблиці T1 визначається (шляхом відображення "один-в-один") множиноюстовпців S2 визначальної таблиці T2, і кожен стовпець з множини S1 є двійникомвідповідного стовпця з множинаі S2, то S1 називається двійником S2 відповідно дотаблиці T2.Якщо ні в жодному зі стовпців можливого ключа не допускається наявність невизначенихзначень, то ця множина стовпців називається BUC-множиною (акронім BUC походить відBase table Unique Constraint). Будь-яка множина стовпців, що є двійником BUC-множини,також є BUC-множиною, так що ця властивість поширюється через різні вирази, щопороджують віртуальні таблиці. Якщо є дві множини стовпців S1 і S2, такі, що S1S2, S1S2,і S2 є BUC-множиною, то і S1 є BUC-множина. Можуть існувати таблиці, в яких BUC-множина є порожньою. Така таблиця може містити не більше одного рядка. З іншого боку,можуть існувати таблиці, в яких взагалі відсутні BUC-множини.

Множина стовпців, що складають первинний ключ таблиці, називається її BPK-множиною(акронім BPK походить від Base table Primary Key). Зрозуміло, що кожна BPK-множина є BUC-множиною. Якщо є дві множини стовпців S1 і S2, такі, що S1S2, S1S2, і S2 є BPK-множиною, то іS1 є BPK-множиною. Подібно BUC-множинам, BPK-множини можуть бути порожніми.

Модель даних SQL 57

Page 58: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

На основі цих визначень в стандарті SQL: 1 999 встановлюються правила функціональнихзалежностей для 11 компонентів мови.

Базові таблиці. Якщо у таблиці є первинний ключ, то відповідна множина стовпців утворюєBPK-множину цієї таблиці. Якщо у таблиці є обмеження з негайною перевіркою унікальності і вжодному стовпці, зазначеному в цьому обмеженні, не допускається наявність невизначенихзначень, то відповідна множина стовпців є BUC-множиною. Якщо множина стовпців UCL базовоїтаблиці - BUC-множина, а CT позначає всю множинуа стовпців цієї таблиці, то FD UCLCT являєсобою відому функціональну залежність базової таблиці.

Конструктори табличних значень. Оскільки для конструкторів табличних значеньнеможливо визначати обмеження, в стандарті SQL: 1999 для них не специфіковані BUC- і BPK-множини. У стандарті не визначаються відомі функціональні залежності для такого родуконструкцій, відмінні від аксіоматичних. Однак стандарт допускає, щоб реалізації SQL включалидодаткові механізми визначення відомих функціональних залежностей.

З’єднані таблиці. Якщо говорити про з’єднані таблиці, одержувані в результатізастосування операцій природного з’єднання (NATUARAL JOIN) або з’єднання c завданням спискуімен стовпців, значення яких повинні збігатися (USING), то зрозуміло, що з’єднана таблиця будемістити двійників з однієї або двох вихідних таблиць. Якщо позначити через S деяку множинустовпців результуючої таблиці, а через CT – всю множину стовпців цієї таблиці, то S є BPK-множиною в тому і т ільки в тому випадку, коли має двійника в одній або обох вихідних таблицях.У такому випадку у всіх стовпцях S не допускаються невизначені значення, і FD SCT є відомоюфункціональною залежністю.

У стандарті визначається кілька правил, на основі яких встановлюються відомі функціональнізалежності з’єднаних таблиць, але тут ми наведемо тільки найпростіше з цих правил. Якщоз’єднана таблиця породжується на основі однієї з двох зазначених вище операцій, то в першійтаблиці-джерелі присутній один або більше стовпців, відповідних однойменним стовпцям другоїтаблиці-джерела. Позначимо через SLCC список наступних виразів (елемент списку відповідаєзагальному стовпцю):

COALESCE (t1.colname, t2.colname) AS colnameНехай JT позначає ключові слова, що визначають тип з’єднання (INNER, LEFT, RIGHT, FULL і т.д.),

і нехай TN1 і TN2 позначають імена таблиць або (якщо вони задані) імена псевдонімів двохтаблиць-джерел відповідно. Позначимо через IR результат обчислення наступного виразузапитів:

SELECT SLCC, T1 *, T2 * FROM T1 JT JOIN T2;Тоді, відповідно до правил SQL, додатковими відомими функціональними залежностями є

такі:

якщо JT задає INNER або LEFT, то діє FD COALESCE (T1.Ci, T2.Ci) T1.Ci для всіх i від одиниці дочисла стовпців в IR;якщо JT задає INNER або RIGHT, то діє FD COALESCE (T1.Ci, T2.Ci) T2.Ci для всіх i від одиницідо числа стовпців в IR.

Позначимо через SL деякий список вибірки. Нехай:

якщо всі стовпці першої та другої таблиць-джерел є загальними, то SL збігається з SLCC;якщо серед стовпців таблиць-джерел немає загальних стовпців, то SL складається зісписку стовпців першої таблиці-джерела, за яким слідує список стовпців другої таблиці-джерела;якщо всі стовпці першої таблиці-джерела є загальними, але у другій таблиці-джерела єокремі стовпці, то SL складається з SLCC, за яким слідує список оскремих стовпців другоїтаблиці-джерела;аналогічно, якщо всі стовпці другої таблиці-джерела є загальними, але у першої таблиці-джерела є окремі стовпці, то SL складається з SLCC, за яким слідує список окремихстовпців першої таблиці-джерела;нарешті, якщо серед стовпців першої таблиці-джерела і серед стовпців другої таблиці-джерела є окремі стовпці, то SL складається з SLCC, за яким слідує список окремихстовпців першої таблиці-джерела, а далі розташовується список окермих стовпців другоїтаблиці-джерела.

Тоді, відповідно стандарту, відомими функціональними залежностями віртуальної таблиці,одержуваної шляхом з’єднання, є відомі функціональні залежності виразу:

SELECT SL FROM IR;Посилання на таблиці. Стовпці віртуальної таблиці, стовреної за посиланням на таблицю, є

природними двійниками стовпців таблиці, яка ідентифікується посиланням. Тому BUC- і BPK-множини результуючої таблиці є двійниками BUC- і BPK-множин вихідної таблиці, і відомі

Модель даних SQL 58

Page 59: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

функціональні залежності результуючої таблиці виходять шляхом заміни імен стовпцівпочаткової таблиці на імена стовпців результуючої таблиці у відомих функціональнихзалежностях вихідної таблиці.

Розділ FROM. На першому кроці виконання оператора вибірки створюється (віртуальна)таблиця, яка є розширеним декартовим добутком всіх таблиць, специфікованих в розділі FROM.Тому в стандарті SQL природним чином формулюються такі правила. Якщо в списку посилань натаблиці розділу FROM міститься всього одне посилання, то BUC- і BPK-множини результуючоїтаблиці є двійниками BUC- і BPK-множин вихідної таблиці. Якщо в списку розділу FROM містятьсядва або більше посилання на таблиці, то, відповідно до стандарту, BUC- і BPK-множинирезультуючої таблиці не визначені. Відомі функціональні залежності результуючої таблиціскладаються з відомих функціональних залежностей кожної таблиці, специфікованої в розділіFROM.

Розділ WHERE. У стандарті міститься набір правил, що дозволяють визначити BUC- і BPK-множини результуючої таблиці, до якої застосовується цей розділ, а також відоміфункціональні залежності результуючої таблиці. Правила грунтуються на особливостяхповедінки предиката порівняння з рівності і логічної операції AND.

Розділ GROUP BY. Для визначення BUC- і BPK-множин і відомих функціональних залежностейрезультуючої таблиці розділу GROUP BY необхідно фактичне створення в результуючій таблицінового стовпця, значення якого могли б якимось чином ідентифікувати рядки вихідної таблиці,що утворюють групи згрупованої таблиці.

Розділ HAVING. BUC- і BPK-множини і відомі функціональні залежності результуючої таблицірозділу HAVING виходять з відповідних множин і FD таблиці, до якої застосовується цей розділ,на основі правил, пов’язаних з умовним виразом розділу HAVING (як і у випадку умови розділуWHERE, в даних правилах враховуються операції порівняння з рівності і логічні операції AND).

Розділ SELECT. На визначення BUC- і BPK-множин і відомих функціональних залежностейрезультату специфікації запиту впливає наявність у списку вибірки виразів (value_expression),відмінних від посилань на стовпці.

Вираз запиту. На визначення BUC- і BPK-множин і відомих функціональних залежностейрезультату виразу запиту впливає наявність в цьому виразі операцій UNION, INTERSECT і EXCEPT.У стандарті відсутні будь-які правила для визначення функціональних залежностей врезультатах рекурсивних запитів. Зазначається лише можливість введення таких правил вреалізаціях.

Розділ WITH CHECK OPTION визначення уявленняНехай у базі даних є спрощена таблиця EMP, містить таке множину рядків.

EMPEMP_NO DEPT_NO EMP_BDATE EMP_SAL1 1 1950 15000.002 1 1950 16000.003 1 1960 14000.004 1 1960 19000.005 2 1950 17000.006 2 1950 16000.007 2 1960 14000.008 2 1960 20000.009 3 1950 18000.0010 3 1950 13000.0011 3 1960 21000.0012 3 1960 22000.00

Припустимо, що в базі даних є подання RICH_EMP, визначене наступним чином:CREATE VIEW RICH_EMP ASSELECT *FROM EMPWHERE EMP_SAL> 18000.00;

Зрозуміло, що у відповідності з правилами SQL над цим поданням можна виконувати операціїоновлення. Як видно, в таблиці EMP міститься рядок, який відповідає службовцю з номером2447, який одержує зарплату в розмірі 20000 грн. Природно, цей рядок буде присутній ввіртуальній таблиці RICH_EMP. Тому можна було б виконати, наприклад, операцію

UPDATE RICH_EMPSET EMP_SAL = EMP_SAL - 3000WHERE EMP_NO = 4452;

Модель даних SQL 59

Page 60: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Але якщо виконання такої операції дійсно допускається, то в результаті рядок, щовідповідає службовцю з номером 2 447, зникне з віртуальної таблиці RICH_EMP. Аналогічнийефект виникне при виконанні операції вставки

Щоб уникнути такої суперечливої поведінки віртуальних таблиць, потрібно включати ввизначення подання розділ WITH CHECK OPTION. При наявності цього розділу до реальноговиконання операцій модифікації або вставки рядків через подання для кожного рядка будеперевірятися умова подання. Якщо ця умова не виконується хоча б для одного з модифікуємогоабо додаваного рядка, то операція повністю відкидається. У певному сенсі (за наявності розділуWITH CHECK OPTION) умову вибірки, що міститься у виразі запитів подання, можна вважатиобмеженням цілісності цього подання.

Режими перевірки CASCADED і LOCALЗгадаймо тепер, що в повному вигляді синтаксис розділу WITH CHECK OPTION може включатиключові слова CASCADED або LOCAL. Обговоримо їхній зміст. Припустимо, що подання V2визначається над поданням V1 так:

CREATE VIEW V2 ASSELECT ...FROM V1WHERE ... [WITH [CASCADED | LOCAL] CHECK OPTION]

Нехай над V2 виконується деяка операція O оновлення бази даних. Тоді:

якщо подання V2 визначалося без розділу WITH CHECK OPTION, то при виконанні операції Oбудуть перевірятися всі умови, що визначають обмеження цілісності V1 (якщо у визначенніV1 присутній розділ WITH CHECK OPTION), але ніяким чином не враховуватимуться умовивибірки, що міститься у виразі запитів подання V2;якщо у визначенні подання V2 містився б розділ WITH LOCAL CHECK OPTION, то привиконанні операції O будуть перевірятися всі умови, що визначають обмеження цілісностіV1, і всі умови, що міститься у виразі запитів подання V2;нарешті, якщо у визначенні подання V2 містився розділ WITH CASCADED CHECK OPTION, топри виконанні операції O будуть перевірятися всі умови, що визначають обмеженняцілісності V1 (так, як якби у визначенні V1 присутній розділ WITH CASCADED CHECK OPTION).Тим самим, перевірятимуться всі обмеження цілісності, встановлені для всіх базовихтаблиць, на яких ґрунтується визначення V1; всі умови всіх подань, визначених над цимибазовими таблицями; і, звичайно, всі умови, що містяться у вираженні запитів подання V2.

Приклади результатів дії розділу WITH CHECK OPTIONЩоб пояснити результати дії розділу WITH CHECK OPTION, припустимо, що в базі даних

присутні визначення двох подань MIDDLE_RICH_EMP і MORE_RICH_EMP:CREATE VIEW MIDDLE_RICH_EMP ASSELECT * FROM EMP WHERE EMP_SAL <20000.00[WITH [CASCADED | LOCAL] CHECK OPTION];CREATE VIEW MORE_RICH_EMP ASSELECT * FROM MIDDLE_RICH_EMP WHERE EMP_SAL> 18000.00[WITH [CASCADED | LOCAL] CHECK OPTION];

Очевидно, що в тіло подання MIDDLE_RICH_EMP будуть входити такі рядки базової таблиціEMP:

MIDDLE_RICH_EMPEMP_NO DEPT_NO EMP_BDATE EMP_SAL1 1 1950 15000.002 1 1950 16000.003 1 1960 14000.004 1 1960 19000.005 2 1950 17000.006 2 1950 16000.007 2 1960 14000.008 3 1950 18000.009 3 1950 13000.00

У тіло подання MORE_RICH_EMP будуть входити такі рядки віртуальної таблиціMIDDLE_RICH_EMP:

MORE_RICH_EMPEMP_NO DEPT_NO EMP_BDATE EMP_SAL

Модель даних SQL 60

Page 61: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

2443 1 1960 19000.00

3.3 Операції оновлення баз даних і механізм тригерів

Поняття тригера в SQL: 1999У мові забезпечуються можливості визначення тригерів, які викликаються ("спрацьовують") привставці одного або кількох рядків у вказану таблицю, при модифікації одного або декількохрядків у зазначену таблицю або при видаленні одного або декількох рядків із зазначеноїтаблиці. Тригер може виконувати будь-яка дію, необхідну для відповідного додатку. Можнавизначити тригери, що спрацьовують по одному разу для операцій INSERT, UPDATE або DELETE,але існує й можливість визначення тригерів, що викликаються при вставці, модифікації абовидаленні кожного окремого рядка. Таблиця, з якою зв’язується визначення тригера,називається предметної таблицею (subject table), а оператор SQL, виконання якого призводитьдо спрацьовування тригера, ми будемо називати ініціюючим (triggering SQL statement).

Тригери можуть спрацьовувати після і до реального виконання ініціюючого оператора SQL. Утілі тригера допускається доступ до значень рядків, що додаються, модифікуються івидаляються. У разі операції модифікації можливий доступ до значень рядків до модифікації ідо значень після модифікації. У відповідності зі стандартом SQL: 1999 будь-який тригерасоціюється тільки з однією базовою таблицею. Не допускається визначення тригерів надподаннями.

Можна придумати різні способи корисного застосування механізму тригерів, але прийнятовважати, що основними областями використання цього механізму є такі.

Журналізація і аудит. За допомогою тригерів можна відстежувати зміни таблиць, для якихпотрібна підтримка підвищеного рівня безпеки. Дані про зміну таблиць можуть зберігатися вінших таблицях і включати, наприклад, ідентифікатор користувача, від імені якого виконуваласяоперація оновлення; часову мітку операції оновлення; самі оновлювані дані і т. д.

Узгодження і очистка даних. З будь-яким простим оператором SQL, оновлюючим деякутаблицю, можна пов’язати тригери, що виконують відповідні оновлення інших таблиць.Наприклад, з операцією вставки нового рядка в таблицю EMP (прийом на роботу новогослужбовця) можна було пов’язати тригер, що модифікує значення стовпців DEPT_EMP_NO іDEPT_TOTAL_SAL11) рядка таблиці DEPT зі значенням стовпця DEPT_NO, яке відповідає номерувідділу нового співробітника.

Операції, що не пов’язані зі зміною бази даних. У тригерах можуть виконуватися не тількиоперації оновлення бази даних. Стандарт SQL дозволяє визначати збережені процедури (якіможуть викликатися з тригерів), що посилають електронну пошту, які друкують документи і т.Д.

Синтаксис визначення тригерів і типи тригерівДля більш детального обговорення механізму тригерів в SQL: 1999 необхідно ввести набірсинтаксичних правил:

trigger_definition :: =CREATE TRIGGER trigger_name{BEFORE | AFTER}{INSERT | DELETE | UPDATE [OF column_commalist]}ON table_name [REFERENCINGold_or_new_values_alias_list]triggered_action

triggered_action :: =[FOR EACH {ROW | STATEMENT}][WHEN left_paren conditional_expression right_paren]triggered_SQL_statement

triggered_SQL_statement :: = SQL_procedure_statement| BEGIN ATOMICSQL_procedure_statement_semicolonlistEND

Модель даних SQL 61

Page 62: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

old_or_new_values_alias :: = OLD [ROW] [AS] correlation_name| NEW [ROW] [AS] correlation_name| OLD TABLE [AS] identifier| NEW TABLE [AS] identifier

В мові є і конструкція, що скасовує визначення тригера:

DROP TRIGGER trigger_name.Як ми бачимо, синтаксичні правила допускають кілька різновидів визначення тригера.

Коротко обговоримо ці різновиди.

Тригери BEFORE і AFTERЯкщо у визначенні тригера вказано ключове слово BEFORE, то тригер буде спрацьовуватибезпосередньо до виконання операції оновлення базової таблиці відповідним ініціюючимоператором SQL. При завданні ключового слова AFTER тригер буде викликатися негайно післявиконання ініціюючого оператора.

Тригери INSERT, UPDATE і DELETEВибір одного з цих ключових слів при визначенні тригера вказує на природу події, яка повиннаприводити до спрацьовування тригера. При завданні ключового слова INSERT доспрацьовування тригера може призвести тільки виконання операції вставки рядків у предметнутаблицю. Якщо вказуються ключові слова UPDATE або DELETE, то число можливих подій, щопризводять до спрацьовування тригера, зростає. Крім явних операцій модифікації рядківпредметної таблиці або видалення з неї рядків до спрацьовування тригера можуть призвестипосилальні дії.

Тригери ROW і STATEMENTЯкщо у визначенні тригера присутня конструкція FOR EACH ROW, то тригер буде викликатисядля кожного рядка предметної таблиці, оновлюваної ініціюючим SQL-оператором. Якщо жзадано FOR EACH STATEMENT (або явна специфікація FOR EACH відсутній), то тригер спрацюєодин раз протягом процесу виконання ініціюючого SQL-оператора.

Розділ WHENВключення у визначення тригера розділу WHEN з відповідним умовним виразом дозволяє більшточно специфікувати умова застосування тригера. Обчислення умовного виразу виконуєтьсянад рядками предметної таблиці, і тригер спрацьовує тільки в тому випадку, коли значеннямумовного виразу є true. Зрозуміло, що види та інтерпретація логічних виразів, що допускаютьсяв розділі WHEN, розрізняються у тригерів з FOR EACH ROW і у тригерів з FOR EACH STATEMENT. Упершому випадку умовний вираз обчислюється для одного рядка, який повинен бути оновленийініціюючим SQL-оператором. У другому – умовний вираз обчислюється для всієї предметноїтаблиці цілком. Слід також розуміти, що обчислення умови розділу WHEN даного тригераздійснюється лише в тому випадку, якщо відбулася подія спрацьовування тригера.

Тіло тригераОперації, які повинні бути виконані при спрацьовуванні тригера, специфицируются всинтаксичної конструкції triggered_SQL_statement (будемо називати її ініціюючим SQL-оператором) .Як видно з синтаксичних правил, можливі два види побудови цієї конструкції: увигляді одиночного оператора SQL і у вигляді списку операторів з дужками BEGIN ATOMIC і END.Для ілюстрації випадку, коли при визначенні триггера досить специфікувати один операторSQL, наведемо приклад визначення тригера, умовою спрацювання якого є виконання операціївставки нового рядка в таблицю EMP (прийом на роботу нового службовця). Якщо значеннястовпця DEPT_NO в черговий додаваємий рядок відмінно від NULL, то тригер належним чиноммодифікує значення стовпців DEPT_EMP_NO і DEPT_TOTAL_SAL рядки таблиці DEPT зі значеннямстовпця DEPT_NO, яке відповідає номеру відділу нового співробітника:

CREATE TRIGGER DEPT_CORRECTION AFTER INSERT ON EMPFOR EACH ROWWHEN (EMP.DEPT_NO IS NOT NULL)UPDATE DEPT SET

Модель даних SQL 62

Page 63: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

DEPT_EMP_NO = DEPT_EMP_NO + 1,DEPT_TOTAL_SAL = DEPT_TOTAL_SAL + EMP_SALWHERE DEPT.DEPT_NO = EMP.DEPT_NO;

Тепер припустимо, що при звільненні службовця (видаленні рядка з таблиці EMP) ми хочемо не

тільки належним чином модифікувати таблицю DEPT, але і зберігти (з метою аудиту) дані прозвільненого працівника в таблиці EMP_DISMISSED15):

EMP_DISMISSED:EMP_NO: EMP_NOEMP_NAME: VARCHARDEPT_NO: DEPT_NO

Визначення відповідного тригера могло б виглядати наступним чином:

CREATE TRIGGER EMP_DISMISSION AFTER DELETE ON EMPFOR EACH ROWBEGIN ATOMICINSERT INTO EMP_DISMISSEDROW (EMP.EMP_NO, EMP.EMP_NAME, EMP.DEPT_NO);UPDATE DEPT SETDEPT_EMP_NO = DEPT_EMP_NO - 1,DEPT_TOTAL_SAL = DEPT_TOTAL_SAL - EMP_SALWHERE DEPT.DEPT_NO = EMP.DEPT_NOEND;

Виконання тригерівПри виконанні кожного тригера система встановлює контекст виконання трігера. Виконаннябудь-якого оператора SQL, оновлюючої базову таблицю бази даних, може призвести доспрацьовування одного або декількох тригерів, а виконання операторів SQL, що містяться втригерах, може призвести до оновлення інших базових таблиць. Ці "внутрітріггерние"(ініційовані) оператори виконуються в контексті поточного тригера, але їх виконання можепризвести до спрацьовування інших тригерів. Для кожного з "вторинних" тригерів утворюєтьсявласний контекст виконання, що дозволяє визначити їх дії точно і незалежно від дій першогонабору тригерів. Виконання вторинних тригерів може призвести до спрацьовування "третинних"тригерів і т.д. - Допускається довільна глибина вкладеності. Для кожного тригера на кожномурівні утворюється власний контекст.

Контекст виконання тригера завжди є атомарним, тобто зініційований SQL-оператор абоуспішно завершується, або результати його дії гарантовано відсутні в базі даних.Для ілюстрації випадку, коли при визначенні триггера досить специфікувати один операторSQL, наведемо приклад визначення тригера, умовою спрацювання якого є виконання операціївставки нового рядка в таблицю EMP (прийом на роботу нового службовця). Якщо значеннястовпця DEPT_NO в черговий додаваємий рядок відмінно від NULL, то тригер належним чиноммодифікує значення стовпців DEPT_EMP_NO і DEPT_TOTAL_SAL рядки таблиці DEPT зі значеннямстовпця DEPT_NO, яке відповідає номеру відділу нового співробітника:

CREATE TRIGGER DEPT_CORRECTION AFTER INSERT ON EMPFOR EACH ROWWHEN (EMP.DEPT_NO IS NOT NULL)UPDATE DEPT SETDEPT_EMP_NO = DEPT_EMP_NO + 1,DEPT_TOTAL_SAL = DEPT_TOTAL_SAL + EMP_SALWHERE DEPT.DEPT_NO = EMP.DEPT_NO;

Тепер припустимо, що при звільненні службовця (видаленні рядка з таблиці EMP) ми хочемо не

тільки належним чином модифікувати таблицю DEPT, але і зберігти (з метою аудиту) дані прозвільненого працівника в таблиці EMP_DISMISSED15):

EMP_DISMISSED:EMP_NO: EMP_NOEMP_NAME: VARCHARDEPT_NO: DEPT_NO

Визначення відповідного тригера могло б виглядати наступним чином:

CREATE TRIGGER EMP_DISMISSION AFTER DELETE ON EMPFOR EACH ROW

Модель даних SQL 63

Page 64: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

BEGIN ATOMICINSERT INTO EMP_DISMISSEDROW (EMP.EMP_NO, EMP.EMP_NAME, EMP.DEPT_NO);UPDATE DEPT SETDEPT_EMP_NO = DEPT_EMP_NO - 1,DEPT_TOTAL_SAL = DEPT_TOTAL_SAL - EMP_SALWHERE DEPT.DEPT_NO = EMP.DEPT_NOEND;

Контекст виконання тригера служить для того, щоб забезпечити СУБД даними, необхідними

для коректного виконання инициируемого оператора SQL. Ці дані представляють собою набірзмін стану, де кожна зміна стану описує зміну даних в цільовій таблиці тригера. Зміна станувключає наступні дані:

тригерну подію - INSERT, UPDATE або DELETE;ім’я предметної таблиці тригера;імена стовпців предметної таблиці, специфікованих у визначенні тригера (тільки длятригерів по UPDATE);набір переходів (подання всіх рядків, що вставляються в предметну таблицю,модифікуються в ній або видаляються з неї), список всіх тригерів рівня STATEMENT, вжевиконаних в деякому (не обов’язково активному) контексті виконання, і список всіхтригерів рівня ROW, вже виконаних в деякому (не обов’язково активному) контекстівиконання, і рядків, над якими ці тригери виконувалися.

Відстеження вже виконаних тригерів ведеться для запобігання багаторазового виконанняодного і того ж тригера в результаті виникнення однієї події, що могло б потенційно привестидо зациклення виконання системи тригерів.

При створенні контексту виконання трігера його набір змін стану спочатку порожній. У набірзмін стану додається кожне надибуємо "нове" зміна стану, в якому не дублюються тригерніподія існуючого зміни стану, ім’я предметної таблиці і імена стовпців предметної таблиці. Набірпереходів кожної зміни стану спочатку порожній, і переходи додаються при кожному оновленніпредметної таблиці, асоційованої зі зміною стану (включаючи оновлення, виробленіпосилальними діями).

Можливості використання старих і нових значеньМи вже продемонстрували використання старих і нових значень у визначенні тригераDEPT_CORRECTION_1. Оскільки ця можливість є важливою особливістю мови SQL, обговоримо їїбільш докладно.

Спочатку трохи поговоримо про синтаксис. Отже, у визначенні тригера може бути присутнімрозділ REFERENCING old_or_new_values_alias_list, причому список визначень псевдонімів можевключати наступні елементи:

OLD [ROW] [AS] correlation_nameNEW [ROW] [AS] correlation_nameOLD TABLE [AS] identifierNEW TABLE [AS] identifier

Кожна з цих конструкцій може входити в список визначень псевдонімів не більше одногоразу, і специфікації OLD ROW і NEW ROW можуть бути присутніми тільки у визначенні тригеріврівня ROW. Обумовлені кореляційні імена та псевдоніми можна використовувати всерединітригера для посилань на значення предметної таблиці. Якщо визначається кореляційне ім’я длянових значень (NEW ROW) або псевдонім для нового вмісту таблиці (NEW TABLE), то ці іменаможна використовувати для посилань на значення, які будуть існувати в предметній таблиціпісля виконання операцій INSERT або UPDATE. Якщо ж визначається кореляційне ім’я для старихзначень (OLD ROW) або псевдонім для старого вмісту таблиці (OLD TABLE), то дані імена можнавикористовувати для посилань на значення, які існували в предметній таблиці до виконанняоперацій UPDATE або DELETE.

Звичайно, не можна використовувати NEW ROW або NEW TABLE в тригерах DELETE, оскількиніякі нові значення не створюються. Аналогічно, не можна використовувати OLD ROW або OLDTABLE в тригерах INSERT, оскільки ніякі старі значення не існували.

Таблиці, на які вказують кореляційні імена або псевдоніми, називаються переходними. Цітаблиці не зберігаються в базі даних довготривало; вони створюються і знищуються динамічно,у міру потреби в контексті виконання тригера. У тригерах рівня ROW можна використовуватикореляційне ім’я, визначене в конструкції OLD ROW, для посилання на значення рядка, щовидаляється або модифікується ініціюючим оператором, в тому вигляді, в якому даний рядок

Модель даних SQL 64

Page 65: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

існував в предметній таблиці до того, як був видалений або модифікований при виконанніініціюючого оператора. У тригерах цього рівня можна також використовувати псевдонім,визначений у конструкції OLD TABLE, для посилання на будь-яке значення перехідної таблиці втому вигляді, в якому вона перебувала до видалення або модифікації чергового рядка привиконанні ініціюючого оператора. У тригерах рівня ROW можна використовувати псевдонім,визначений у конструкції OLD TABLE, для посилання на будь-яке значення предметної таблиці втому вигляді, в якому вона перебувала до виконання ініціюючого оператора. Аналогічні справи звикористанням кореляційних імен і псевдонімів, визначених у конструкціях NEW ROW і NEW TABLE.

Для тригерів категорії BEFORE є істотне обмеження: в них не дозволяється використовуватиконструкції OLD TABLE і NEW TABLE, а внутрішньотригерний SQL-оператор не може проводитибудь-які зміни в базі даних. Підставою для такого обмеження є те, що на перехідні таблиці,породжувані OLD TABLE і NEW TABLE, можуть істотно впливати посилальні дії, які активізуютьсяв результаті змін бази даних при виконанні внутрішньотригерного SQL-оператора. Тому значеннярядків в таких таблицях можуть виявитися нестабільними і недостатньо передбачуваними,якщо тригер спрацьовує раніше дії триггерного оператора SQL.

Обробка декількох тригерів, пов’язаних з однієї предметної таблицеюУ SQL: 1999 не забороняється визначення кількох тригерів, асоційованих з однієї предметноїтаблицею, що відносяться до однієї і т ієї ж категорії (BEFORE або AFTER) і спрацьовують поодній і т ій же події. Зрозуміло, що при виникненні умови спрацьовування всіх таких тригерівсистема повинна вибрати порядок, в якому вони будуть виконуватися.

Рішення, прийняте в SQL, є гранично простим, хоча і дещо дивним. При визначенні кожноготригера фіксується тимчасова мітка виконання оператора CREATE TRIGGER, і всі тригери,асоційовані з однієї предметної таблицею, що відносяться до однієї і т ієї ж категорії (BEFOREабо AFTER) і спрацьовують по одній і т ій же події, впорядковуються у відповідності зі своїмитимчасовими мітками. Тоді при виникненні умови спрацьовування всіх тригерів однієї груписпочатку виконується тригер, потім другий і т.д. У Стандарті не специфікується точністьтимчасової мітки, яку пов’язують з тригером, і якщо в одній групі виявляються два або більшетригерів з невиразними тимчасовими мітками, то порядок їх виконання повинен визначатися вреалізації.

Підхід до встановлення порядку виконання тригерів відповідно до їх тимчасових міток можевикликати чисто практичні труднощі у користувачів SQL-орієнтованих СУБД. Наприклад, якщо вході розробки програми з’ясується потреба у визначенні нового тригера, який повиненвиконуватися раніше деякого існуючого тригера тієї ж групи, то стандарт не можезапропонувати нічого кращого, окрім як знищити визначення всіх тригерів цієї групи, а потімзаново визначити їх у потрібному порядку .

І ще одна цікава властивість тригерів в SQL: +1999. Як вже говорилося раніше в цьомурозділі, кожен зініційований SQL-оператор повинен бути атомарним, тобто якщо його виконаннязавершується неуспішно, то в базі даних не повинно залишитися ніяких слідів подібноговиконання. Але в стандарті говориться більше: неуспішне виконання хоча б одного тригера згрупи з однаковим умовою спрацьовування повинно призводити до скасування результатіввиконання ініційованих SQL-операторів всіх тригерів цієї групи, а також до скасуваннярезультатів виконання самого ініціюючого SQL-оператора.

ВисновкиУ цій лекції ми обговорили важливі аспекти мови SQL, що відносяться до механізмів оновленняданих. Розглянули оператори прямого SQL, призначені для вставки, модифікації і видаленняданих з існуючих таблиць. Оператори UPDATE і DELETE цієї категорії іноді називаютьпошуковими, оскільки в них включаються умови на рядки таблиці, які повинні бути модифікованіабо видалені. У мові SQL визначені також позиційні оператори модифікації і видалення рядків, атакож динамічні позиційні варіанти даних операторів. Пошукові версії операторів модифікації івидалення добре характеризують відповідні можливості мови SQL.

Тема 4 Управління транзакціями засобами SQL4.1 ACID-транзакція4.2 Породження транзакцій в SQL: +1999

4.2.1. Установка характеристик транзакції.4.2.2. Явна ініціація транзакції.4.2.3. Рівні ізоляції SQL-транзакції

Модель даних SQL 65

Page 66: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Феномен "брудного" читання (dirty read)Феномен неповторюваного читання (unrepeatable read)Феномен фантомів

4.3 Завершення транзакцій4.5 Транзакції і обмеження цілісності4.6 Точки збереженняВисновки

ТЕМА 4УПРАВЛІННЯ ТРАНЗАКЦІЯМИ ЗАСОБАМИ SQL

4.1 ACID-транзакціяУ SQL: 1999 підтримується класичне розуміння транзакції, що позначається абревіатурою ACID(від Atomicy, Consistency, Isolation і Durability). Відповідно з цим поняттям під транзакцієюрозуміється послідовність операцій (наприклад, над базою даних), що володіє такимивластивостями.

Атомарність (Atomicy). Ця властивість означає, що результати всіх операцій, успішновиконаних у межах транзакції, повинні бути відображені в стані бази даних, або в стані базиданих не повинно бути відображено дію жодної операції (звичайно, тут мова йде про операції,що змінюють стан бази даних). Властивість атомарності, яку часто називають властивістю "всеабо нічого", дозволяє розглядати транзакцію, як динамічно створену складову операції надбазою данних.

Узгодженість (Consistency). У класичному сенсі ця властивість означає, що транзакція можебути успішно завершена з фіксацією результатів своїх операцій тільки в тому випадку, коли діїоперацій не порушують цілісність бази даних, тобто задовольняють набору обмежень цілісності,визначених для цієї бази даних. У стандарті SQL: 1 999 ця властивість розширюється тим, щопід час виконання транзакції дозволяється встановлювати точки узгодженості і явним чиномперевіряти обмеження цілісності.

Ізоляція (Isolation). Потрібно, щоб дві одночасно виконувані транзакції жодним чином не діялиодна на іншу. Іншими словами, результати виконання операцій транзакції T1 не повинні бутивидні ніякий іншій транзакції T2 до тих пір, поки транзакція T1 не завершується успішно.

Довговічність (Durability). Після успішного завершення транзакції всі зміни, які були внесені встан бази даних операціями цієї транзакції, повинні гарантовано зберігатися, навіть у разі збоївапаратури або програмного забезпечення.

4.2 Породження транзакцій в SQL: +1999У відповідності зі стандартом мови SQL: 1999 транзакції можуть утворюватися явним чином звикористанням оператора START TRANSACTION, або неявно, коли виконується оператор, якийпотрібен контекст транзакції, а цього контексту не існує. Наприклад, оператори SELECT,UPDATE або CREATE TABLE можуть виконуватися тільки в контексті транзакції, а для виконанняоператора CONNECT такий контекст не потрібен, і виконання оператора CONNECT не приводитьдо неявного утворенню транзакції. Для завершення транзакції повинен бути явно використанийодин із двох операторів – COMMIT (вимога завершити транзакцію з фіксацією її результатів) абоROLLBACK (вимога завершити транзакцію з видаленням результатів усіх виконаних операцій зістану бази даних).

4.2.1. Установка характеристик транзакції.У кожної виконуваної транзакції є три характеристики, значення яких істотно впливають на діїсистеми при управлінні транзакцією, – рівень ізоляції (isolation level), режим доступу (accessmode) і розмір області діагностики. При неявному утворенні транзакції ці характеристикивстановлюються за замовченням: транзакція отримує максимальний рівень ізоляції відодночасно виконуваних транзакцій; режим доступу, що дозволяє виконувати і операції вибірки, іоперації оновлення бази даних; і призначений за замовченням розмір області діагностики.

Якщо значення характеристик транзакції, встановлених за замовченням, в деякому випадку

Модель даних SQL 66

Page 67: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

не є придатними, то до виконання оператора, неявно ініціюючого транзакцію, можна явновстановити характеристики даної транзакції з використанням оператора SET TRANSACTION. Цейоператор визначається такими синтаксичними правилами:

SET TRANSACTION mode_commalistmode :: = isolation_level| access_mode| diagnostics_sizeisolation_level :: = READ UNCOMMITED| READ COMITTED| REPEATABLE READ| SERIALIZABLEaccess_mode :: = READ ONLY| READ WRITEdiagnostics_size :: = DIAGNOSTIC SIZE value_specification

Операцію установки характеристик транзакції не можна виконувати в контексті будь-якої

активної транзакції. Виконання операції допустимо тільки до утворення першої транзакції SQL-сесії або між послідовно виконуваними транзакціями цієї сесії. В одному операторі SETTRANSACTION можна задати тільки по одному значенню кожної з трьох характеристик, аледопускається послідовне виконання кількох таких операцій з різними операндами.

Як видно з синтаксичних правил, у характеристики режим доступу може бути зазначено однез двох значень – READ ONLY або READ WRITE. Якщо встановлюється режим READ ONLY, то втранзакції не можна буде виконувати ніякі операції, які змінюють базу даних, у тому числіоперації оновлення таблиць і визначення нових об’єктів бази даних. Якщо режим доступу явноне вказується, за замовченням приймається характеристика READ WRITE, якщо тільки в якостізначення характеристики рівень ізоляції не вказується READ UNCOMITTED (в цьому випадкувстановлюється режим доступу READ ONLY).

Якщо вказується розмір області діагностики, то після ключових слів DIAGNOSTIC SIZE повиненслідувати цілочисельний літерал, що визначає число діагностичних елементів, які повиннірозміститися в області діагностики (число виняткових ситуацій, попереджень, повідомлень провідсутність даних і про успішне виконання, які будуть вироблятися при виконанні операторіввсередині майбутньої транзакції). Якщо розмір області діагностики явно не вказується, торішення про розмір цієї області приймається в реалізації.

Рівні ізоляції будуть детально обговорюватися нижче, але тут ми зауважимо, що якщозначення рівня ізоляції явно не задано, то за замовченням приймається рівень ізоляціїSERIALIZABLE. Крім того, одночасне завдання рівня ізоляції READ UNCOMITTED і режиму доступуREAD WRITE не допускається.

Виконання кожного наступного оператора SET TRANSACTION повністю перекриває ефектвиконання попереднього такого оператора. Зокрема, якщо в попередньому операторі явнозадавалося значення деякої характеристики, а в наступному це значення приймається зазамовченням, то саме значення за замовченням буде значенням характеристики транзакції.

4.2.2. Явна ініціація транзакції.Для явного визначення транзакції підтримується оператор START TRANSACTION, якийвизначається наступними синтаксичними правилами:

START TRANSACTION mode_commalistЦей оператор дуже схожий на SET TRANSACTION. Єдина (хоча і дуже істотна) відмінність

полягає в тому, що виконання оператора START TRANSACTION призводить не тільки доустановки характеристик транзакції, але і до реальної ініціації транзакції.

4.2.3. Рівні ізоляції SQL-транзакціїУ стандарті SQL: 1 999 рівні ізоляції визначаються на основі декількох феноменів, які можутьвиникати при виконанні транзакцій.

Феномен "брудного" читання (dirty read)До цього феномену схильні транзакції, в яких допускається можливість бачити зміни об’єктівбази даних, зроблені іншими одночасно виконуваними і ще не зафіксованими транзакціями.Простий приклад феномена "брудного" читання показаний на рис. 4.1.

Модель даних SQL 67

Page 68: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Рисунок 4.1 – Ілюстрація до феномену «брудного» читанняНа цьому рисунку показано, що в момент часу t0 були утворені дві транзакції T1 і T2. У момент

часу t1 транзакція T1 успішно виконує операцію модифікації деякого об’єкта бази даних O. Умомент часу t2 (t2 > t1) транзакція T2 читає об’єкт O, після чого успішно завершується в моментчасу t3. Транзакція ж T1 завершується в момент часу t4 (t4 > t3), причому в ній виконуєтьсяоператор ROLLBACK, що призводить до ліквідації в базі даних наслідків зміни об’єкта O. Урезультаті виявляється, що в транзакції T2 оброблялися дані, які реально не існують у базіданих (звідси і термін "брудні" дані).

У SQL феномен "брудного" читання може спостерігатися у транзакцій, що виконуються нарівні ізоляції READ UNCOMMITTED. Рекомендується використовувати цей рівень ізоляції т ільки втих транзакціях, для виконання функцій яких точні дані не обов’язкові (наприклад, утранзакціях, що виконують статистичну обробку).

Феномен неповторюваного читання (unrepeatable read)До цього феномену схильні транзакції, які читають деякі об’єкти бази даних і допускають змінивже прочитаних об’єктів іншими транзакціями. Приклад феномена неповторюваного читанняпоказаний на рис. 4.2.

Рисунок 4.2 – Ілюстрація до феномену неповторюваного читанняНа цьому рисунку показано, що в момент часу t0 були утворені дві транзакції T1 і T2. У момент

часу t1 транзакція T2 виконує операцію читання деякого об’єкта бази даних O (наприклад,виконує вибірку рядків з таблиці із вказівкою значення первинного ключа). У момент часу t2 (t2 >t1) транзакція T1 змінює об’єкт O (модифікує або навіть видаляє). У момент часу t3 (t3 > t2)транзакція T2 повторно зчитує об’єкт O і виявляє, що він змінився або зовсім відсутній. Іншимисловами, в транзакції T2 повторне виконання вибірки об’єкта бази даних O дало результат,відмінний від результату першого виконання (звідси і походить термін "неповторюванихчитання").

У SQL феномен неповторюваного читання може спостерігатися у транзакцій, що виконуютьсяна рівні ізоляції READ COMMITTED (цей рівень ізоляції, як показує його назва, гарантує відсутністьфеномена "брудного" читання).

Модель даних SQL 68

Page 69: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Феномен фантомівДо цього феномену схильні транзакції, що виконують вибірку рядків і таблиць бази даних ідопускають додавання до даних таблиць іншими транзакціями рядків, що задовольняють умовівибірки. Приклад феномена фантомів показаний на рис. 4.3.

Рисунок 4.3 – Ілюстрація до феномену фантомівНа цьому рисунку показано, що в момент часу t0 були утворені дві транзакції, T1 і T2. У момент

часу t1 транзакція T2 виконує операцію вибірки рядків з таблиці R за умовою c. У момент часу t2(t2 > t1) транзакція T1 виконує над таблицею R операцію оновлення (вставки або модифікаціїрядків), в результаті якої в таблиці R з’являються додаткові рядки, що задовольняють умові c.У момент часу t3 (t3 > t2), транзакція T2 повторно виконує операцію вибірки рядків з таблиці R заумовою c і виявляє наявність в результаті додаткових фантомних рядків.

У SQL феномен фантомів може спостерігатися у транзакцій, що виконуються на рівні ізоляціїREPEATABLE READ (цей рівень ізоляції, як показує його назва, гарантує відсутність феноменанеповторюваного читання).

Нарешті, для транзакцій, що виконуються на рівні ізоляції SERIALIZABLE, неможливо і проявфеномена фантомів. Термін serializable (серіалізуємість) використовується з тієї причини, що прироботі на даному рівні ізоляції сумарний ефект виконання набору транзакцій {T1, T2, ..., Tn}ідентичний ефекту деякого послідовного виконання цих транзакцій. Це означає граничнуізольованість транзакцій. Загальна картина взаємозв’язку рівнів ізоляції і феноменів транзакційпоказана в таблиці 4.1.

Таблиця 4.1 – Рівні ізоляції і феномени

Рівень "Брудне" читання Неповторюване читання ФантомиREAD UNCOMMITTED Можливо Можливо МожливіREAD COMMITTED Неможливо Можливо МожливіREPEATABLE READ Неможливо Неможливо МожливіSERIALIZABLE Неможливо Неможливо Неможливі

4.3 Завершення транзакційЯк ми зазначали на початку цього розділу, транзакції можуть ініціюватися як явним способом(за допомогою оператора START TRANSACTION), так і неявно, при виконанні першого оператора,який вимагає наявності контексту транзакції. Для завершення транзакції завжди потрібневиконання одного з двох операторів COMMIT (фіксація транзакції) або ROLLBACK (відкаттранзакції), які мають наступний синтаксис:

COMMIT [WORK] [AND [NO] CHAIN]ROLLBACK [WORK] [AND [NO] CHAIN][TO SAVEPOINT savepoint_name]

При бажанні завершити транзакцію таким чином, щоб всі виконані нею зміни були назавждизбережені в базі даних, слід завершувати транзакцію оператором COMMIT (як видно зсинтаксису, допускається еквівалентний вид COMMIT WORK). Якщо потрібно завершититранзакцію з анулюванням всіх проведених змін, то потрібно використовувати операторROLLBACK (ROLLBACK WORK).

Зауважимо, що і операція фіксації транзакції, і операція відкату є досить складними і

Модель даних SQL 69

Page 70: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

виконуються не миттєво. Тому в ході виконання цих операцій може відбутися аварійна відмовасистеми. Природно, база даних буде відновлена до свого останнього узгодженого стану, алеситуації перерваного виконання операції фіксації та операції відкоту докорінно різняться.Оператор COMMIT вважається безумовно виконаним тільки в тому випадку, коли сервер базданих підтвердив це після виконання всіх дій, необхідних для фіксації транзакції. Аварійнаситуація під час виконання операції ROLLBACK нічим не відрізняється від аварійної ситуації, щовиникла в процесі виконання транзакції. У цьому випадку (при відновленні бази даних)перервана транзакція вважається незафіксованою (що так і є), і всі її зміни автоматичновидаляються зі стану бази даних. Тому остаточний результат виконання операції фіксаціїтранзакції, перерваної аварійною відмовою системи, еквівалентний успішному виконаннюоперації відкоту транзакції.

Синтаксис обох операторів показує, що в кожному з них може міститися розділ AND [NO]CHAIN.

Операції визначення і завершення транзакції є досить дорогими. Особливо це стосуєтьсяоперації завершення транзакції, при виконанні якої необхідно виконати обміни із зовнішньоюпам’яттю. З іншого боку, використання довготривалих транзакцій загрожує зниженням рівняпаралелізму в системі, а також підвищує ризик втрати результатів транзакції в результатісистемного відмови.

Тому часто використовується компромісний варіант, при якому дії операторів COMMIT абоROLLBACK призводять не тільки до завершення поточної транзакції, але і до утворення новоїтранзакції. Саме цю можливість підтримує розділ AND [NO] CHAIN операторів COMMIT і ROLLBACK.Якщо такий розділ відсутній в операторі завершення транзакції, то мається на увазі наявністьрозділу AND NO CHAIN, і нова транзакція не утворюється. Якщо ж розділ AND CHAIN присутній,то негайно після завершення виконання COMMIT або ROLLBACK поточної транзакції утворюєтьсянова транзакція, що наслідує всі характеристики завершеної транзакції.

4.5 Транзакції і обмеження цілісностіБудь-яке обмеження цілісності володіє атрибутом, що визначає час перевірки даногообмеження. Цей атрибут може мати значення DEFERRABLE (відкладена перевірка) або NOTDEFERRABLE (негайна перевірка). Щоб дане обмеження цілісності могло коли-небудь мативластивість відкладеної перевірки, потрібно, щоб у визначенні такого обмеження присутніключові слова INITIALLY DEFERRED або INITIALLY IMMEDIATE. У кожному разі, в кожен момент часувиконання транзакції будь-яке обмеження цілісності знаходиться в одному з двох станів -відкладена перевірка або негайна перевірка. Якщо початковим станом обмеження є INITIALLYDEFERRED, то на початку будь-якої транзакції його поточним станом буде відкладена перевірка.Аналогічно для обмежень з початковим станом INITIALLY IMMEDIATE.

Будь-яке обмеження, що знаходиться в стані негайної перевірки, завжди перевіряється вкінці виконання будь-якого оператора SQL. Негайно перевіряються і т і обмеження, які буливизначені як NOT DEFERRABLE, але для яких згодом було встановлено режим негайної перевірки.Однак якщо поточним станом обмеження є відкладена перевірка, воно буде перевірятисятільки тоді, коли перейде в стан негайної перевірки. Це робиться неявно при виконанніоператора COMMIT або явно при виконанні оператора SET CONSTRAINTS. Цей оператор має такийсинтаксис:

SET CONSTRAINTS {ALL | constraint_name_commalist}{DEFERRED | IMMEDIATE}

Ключове слово ALL є скороченою формою завдання списку імен всіх обмежень цілісності,визначених у базі даних, які специфіковані із зазначенням ключового слова DEFERRABLE. Якщосписок імен обмежень задається явно, то всі вхідні в нього імена повинні відповідатиобмеженням, визначеним із зазначенням ключового слова DEFERRABLE.

При спробі фіксації транзакції, для якої є одне або кілька обмежень цілісності, поточнимрежимом яких є відкладена перевірка, система (ненадовго, оскільки транзакція скоро тим чиіншим способом завершиться) встановлює для всіх цих обмежень режим негайної перевірки іперевіряє обмеження. Якщо будь-яке з обмежень порушується, то операція COMMIT трактуєтьсяяк операція ROLLBACK, і користувачеві (або додатком) повідомляється, що виникла помилка.Уникнути цієї неприємної ситуації можна явним виконанням оператора SET CONSTRAINTS ALLIMMEDIATE до фіксації транзакції, для якої є DEFERRABLE обмеження, поточним режимом яких євідкладена перевірка.

4.6 Точки збереження

Модель даних SQL 70

Page 71: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Як ми вже відзначали, використання довготривалих транзакцій підвищує ризик повногоанулювання результатів транзакції через порушення обмежень з відкладеним перевіркою привиконанні будь-який експериментальних (недостатньо перевірених) операцій. Звичайно,теоретично можна було б оформляти виконання кожної такої підозрілої операції у виглядіокремої транзакції, але це часто суперечить загальній логіці програми, коли послідовність дійповинна бути атомарної.

Часткове вирішення цієї проблеми надає механізм точок збереження (savepoint) SQL: 1999.Точка збереження є свого роду позначкою в послідовності операцій транзакції, яку надаліможна використовувати для часткового відкату транзакції із збереженням життєздатностітранзакції і результатів операцій, виконаних у транзакції до точки збереження. Прикладвикористання точки збереження показаний на рис. 4.4.

Рисунок 4.4 – Приклад транзакції з точкою збереженняНа цьому рисунку після виконання послідовності перевірених "безпечних" операцій, які, на

думку користувача, не можуть порушити обмеження цілісності з відкладеним перевіркою,встановлюється точка збереження. За цією точкою слідує серія "ризикованих" операцій. Якщо зякихось причин (наприклад, шляхом негайної перевірки відкладених обмежень) потімприймається рішення про недоцільність фіксації результатів даних операцій, то виконуєтьсячастковий відкат транзакції до точки збереження, а потім фіксуються результати безпечнихоперацій.

Допускається установка в одній транзакції декількох послідовних точок збереження. Приустановці кожної точки збереження їй призначається деяке (локальне в межах транзакції) ім’я,яке в подальшому може використовуватися в операції ROLLBACK для завдання точкичасткового відкату транзакції. Якщо послідовно встановлюються дві точки збереження SP1 іSP2 і потім виконується операція ROLLBACK TO SAVEPOINT SP1, то відновлення виробляється доSP1 (через SP2), і точка збереження SP2 "забувається".

Для встановлення точки збереження використовується оператор SAVEPOINT c очевиднимсинтаксисом

SAVEPOINT savepoint_nameМожна також відмовитися від раніше встановленої точки збереження, видаливши її з

контексту транзакції. Для цього призначений оператор RELEASE, синтаксис якого такожочевидний:

RELEASE SAVEPOINT savepoint_nameПісля виконання цієї операції в даній транзакції неможливо виконувати які-небудь інші

операції над точкою збереження з даним ім’ям, поки не буде утворена інша однойменна точказбереження.

Висновки

Основи мови PL/SQL 71

Page 72: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Основи мови PL/SQL

5.1 Алфавіт і лексеми мови. Структура програми5.2 Типи даних та оголошення змінних

5.2.1. Оголошення скалярних типів даних.5.2.2. Оголошення змінних типу RECORD (записи).

5.3 Оператори5.3.1. Оператор присвоювання5.3.2. Оператор циклу LOOP.

5.4 Курсори5.4.1. Явний курсор.5.4.2. Неявні курсори.

5.5 Обробка виняткових ситуацій5.5.1. Стандартні виняткові ситуації.5.5.2. Користувальницькі виняткові ситуації.5.5.3. Приклади.

Висновки

Ключові терміни:лексема, літерал, роздільник

5.1 АЛФАВІТ І ЛЕКСЕМИ МОВИ. СТРУКТУРА ПРОГРАМИPL / SQL – це процедурна, блочно-структурована мова програмування, що є розширенням мовиSQL СУБД Oracle. Вона надає ряд можливостей, які дозволяють створити великі,багатофункціональні програми для роботи з БД.

Алфавіт мови включає такий набір символів:

англійські букви верхнього і нижнього регістрів A..Z, a..z;арабські цифри 0..9;символи + - * / <> =; :. , ‘~! @ # $% ^ & _ () {} [];символи табуляції, пробіли і символи повернення каретки.

Лексеми (групи символів алфавіту) поділяються на ідентифікатори, літерали, роздільники йкоментарі.

Ідентифікатори мають довжину до тридцяти символів і складаються з великих і малих літер,цифр і знака підкреслення, причому перша повинна бути буква. Допускається, але нерекомендується використовувати спеціальні символи, такі як #, $. Деякі з ідентифікаторів вмові PL / SQL мають спеціальне синтаксичне значення. Такі ідентифікатори називаютьсязарезервованими і не повинні перевизначатись.

Літерали – це явно задані числі, символи, рядки або логічні значення, не представленіідентифікатором. Літерали діляться на числові, рядкові та логічні.

Числові літерали бувають двох типів: цілі та дійсні. Цілі літерали – це знакові числа бездесяткового дробу (6; -14). Дійсні літерали – знакові цілі або дробові числа з десяткової точкою(6.667; -12.0). Допускається запис числових літералів в експоненціальній формі (1.0Е-7; 2Е5).

Строкові літерали – це послідовність символів, укладених в одинарні лапки (апострофи). Всірядкові літерали, за виключенням порожнього рядка (‘‘) мають тип CHAR. Якщо в строковомулітералі необхідно вказати одинарну лапку, то при записі вона просто подвоюється.

Логічні літерали – це зумовлені значення TRUE, FALSE і NULL. NULL вказує на невідомезначення.

Роздільник – це сукупність одного або двох символів, яка має певне значення в PL / SQL.Прості роздільники містять тільки один символ. До них відносяться, наприклад, знакиарифметичних операцій (+, -, *, /), знаки операцій відносини (=,>, <), ознака кінця виразу (;).Складові роздільники містять два символи. До них відносяться, наприклад, операторприсвоювання (: =), оператор конкатенації (||), Операція зведення в ступінь (**), початок і кінецьмітки (<< >>), оператор діапазону (..), операція відношення нерівно (<>,! =, ~ =, ^ =), операція

Основи мови PL/SQL 72

Page 73: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

відношення менше або дорівнює (<=), операція відношення більше або дорівнює (> =).Коментарі містять пояснювальний текст і поділяються на однорядкові і багаторядкові.

Однорядковий коментар є рядком, що починається з двох символів дефіс (-). У багаторядковомукоментарі текст розмішується в спеціальні роздільники / * * /.

Структура програми представляє собою набір блоків PL / SQL, рекурсивно вкладених один водного.

Структура блоку:[<< мітка >>][DECLARE розділ оголошень]BEGINвиконуваний розділ[EXEPTIONрозділ обробки виключень]END [<< мітка >>];

Обов’язковою має бути тільки виконуваний розділ, що містить оператори мови. Існують такітипи блоків: анонімні, іменовані, тригери і підпрограми (процедури, функції, пакети).

Анонімні блоки, на відміну від іменованих, не містять міток. Іменовані і анонімні блокиназиваються динамічними блоками

5.2 ТИПИ ДАНИХ ТА ОГОЛОШЕННЯ ЗМІННИХОголошення змінних здійснюється в розділі оголошень, при цьому крім ідентифікатора змінноїповинен бути вказаний і її тип.

До основних типів даних мови PL / SQL відносяться скалярні і складені. Серед складових типівнайбільший інтерес представляє тип RECORD (записи).

5.2.1. Оголошення скалярних типів даних.Серед скалярних типів найбільш поширені числові, символьні, тип DATE і логічний (BOOLEAN) типиданих.

Числові типи даних представлені в основному двома типами: BINARY_INTEGER і NUMBER. Всіінші числові типи є підмножинами двох цих типів.

Тип змінних BINARY_INTEGER використовується для зберігання цілих знакових чисел вдвійковому вигляді. Діапазон цього типу від -2147483647 До 2147483647.

Тип змінних NUMBER використовується для зберігання чисел з фіксованою та плаваючоюкрапкою в діапазоні від 1Е-130 до 10Е125. Для оголошення чисел з плаваючою точкою можнапросто вказати NUMBER.

Для оголошення цілого числа вказується NUMBER (точність), а для оголошення числа зфіксованою точкою додатково вказується ще й масштаб, тобто NUMBER (точність, масштаб).Точність представляє собою загальне число знаків і не перевершує 38 десяткових знаків,масштаб вказує порядок округлення і задається числом від -84 до 127.

При позитивному значенні масштабу число округлюється до зазначеної кількості цифр, щостоять праворуч від коми; при негативному значенні – до зазначеної кількості цифр, що стоятьзліва від коми. Наприклад: число 123.456 при значенні масштабу, рівному 2, округлюється до123.46, а при значенні, рівному -2, до 100.

До символьних типів даних в основному відносяться типи CHAR і VARCHAR2.Тип CHAR (довжина) використовується для зберігання послідовності символів фіксованої

довжини не більше 32767 байт. Слід мати на увазі, що в мові SQL максимальне значенняаналогічного типу 2000 байт, тому не всі дані цього типу можна вставляти в стовпці таблиці зтипом CHAR.

Тип VARCHAR2 (довжина) використовується для зберігання символьної послідовності змінноїдовжини. Обмеження на довжину складає 32767 байт.

Тип DATE використовується для зберігання значень дати і часу. Значення дати і часузберігається у внутрішньому двійковому форматі і при приміщенні його в змінну символьного типуавтоматично перетворюється в рядок, використовуючи формат дати, встановлений зазамовчуванням.

Функція SYSDATE повертає поточне значення дати і часу.Тип BOOLEAN використовується для зберігання логічних значень TRUE, FALSE, NULL. Над

такими змінними можна виконувати тільки логічні операції, причому в тризначній логіці.Скалярні змінні оголошуються явним і неявним чином.Явна оголошення змінної будь-якого з скалярних типів відбувається за таким правилом:

ім’я_змінної [CONSTANT] тип [NOT NULL][{: = ⎪DEFAULT} значення];

Основи мови PL/SQL 73

Page 74: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

При використанні ключового слова CONSTANT змінній повинне бути присвоєно значення, якезгодом не може бути змінене. Якщо вказано ключове слово NOT NULL, то змінну необхіднопроініціалізувати, і згодом вона не може приймати значення NULL. Змінна ініціалізуєтьсязначенням свого типу або за допомогою оператора присвоювання, або за допомогою ключовогослова DEFAULT. Кожна змінна оголошується окремо.

Неявне оголошення змінної скалярного типу здійснюється за допомогою спеціальногоатрибута% TYPE, який дозволяє оголосити змінну, тип якої відповідає будь-якому типу іншоїзмінної, будь-якому типу стовпця таблиці БД.Приклади

A1 NUMBER;A11 NUMBER: = 15;A12 NUMBER NOT NULL DEFAULT 15;A2 A1% TYPE;A3 BOOKS.PRICE% TYPE;

Оголошуючи змінні, слід мати на увазі, що:

імена локальних змінних і формальних параметрів мають пріоритет перед іменами таблицьБД;імена стовпців таблиці БД мають пріоритет перед іменами локальних змінних і формальнихпараметрів.

5.2.2. Оголошення змінних типу RECORD (записи).Складовий тип запису визначає структуру, що містить деяку кількість змінних. Змінні можутьбути будь-якого типу, в тому числі і раніше визначеними записами. Посилання на окреміелементи цієї структури здійснюється за допомогою точкової нотації.

Тип запису повинен бути визначений до того, як будуть оголошені змінні цього типу. Дляявного визначення нового складеного типу даних використовується такий загальнийсинтаксис:

TYPE тип_запису IS RECORD(поле1 тип1 [NOT NULL] [{: = ⎪ DEFAULT} значення1], поле2 тип2 [NOT NULL] [{: = ⎪ DEFAULT} значення2], ...);

Для явного оголошення змінної-запису цього типу необхідно вказати ім’я змінної і ім’я типу.Допускається неявне визначення змінних типу запису, що виконується за допомогою атрибуту %ROWTYPE, що дозволяє визначати змінні-записи, структура яких ідентична структурі записузазначеної таблиці або структурі раніше визначеної змінної-запису.Розглянемо змінну-запис, яка оголошується явно:

DECLARETYPE BOOK IS RECORD -- вводиться тип запису - BOOK(AUTHOR VARCHAR2 (15), -- прізвище учасникаTITLE VARCHAR2 (25), -- назва книгиPRICE NUMBER (6) -- вартість);BOOK_FAN BOOK; -- явне оголошенняBOOK_ROM BOOK; -- явне оголошенняBOOK_POEM BOOK_FAN% ROWTYPE; -- неявне оголошення

Присвоєння значень елементів, що входять в запис, необхідно виконувати поелементно,використовуючи точкову нотацію:

BOOK_FAN.PRICE: = 16000;Для присвоєння значень відразу всім полів запису або декільком з них можна скористатися

однорядковим оператором SELECT або оператором вибірки чергового рядку з відкритого курсорFETCH.

Можливо привласнення значень однієї змінної-запису іншій за умови, що вони одного типу:BOOK_FAN: = BOOK_ROM;

Проте слід мати на увазі, що змінна-запис, тип якої визначений явно, і змінна-запис, тип якоївизначається за допомогою атрибуту% ROWTYPE, завжди несумісні.

Не допускається порівняння змінних-записів.Помилковою буде спроба передати в якості значень в команді INSERT запис цілком. Значення

запису повинні передаватися поелементно:INSERT INTO TEMP VALUES (BOOK_FAN.AUTHOR,BOOK_FAN.TITLE, BOOK_FAN.PRICE);.

Основи мови PL/SQL 74

Page 75: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

5.3 ОПЕРАТОРИОператори мови PL / SQL представлені оператором присвоювання, умовним оператором IF іоператором циклу LOOP.

5.3.1. Оператор присвоюванняОператор присвоювання дозволяє задати змінній деяке значення і має такий синтаксис:

Змінна: = вираз;Умовний оператор IF, що дозволяє перевірити деякий набір умов і виконати відповідні дії, має

такий синтаксис:IF логічний вираз1 THENпослідовність операторів1ELSЕ логічний вираз2 THENпослідовність операторів2ELSEпослідовність операторів3ENF IF;

5.3.2. Оператор циклу LOOP.Оператор циклу LOOP дозволяє повторити виконання заданої послідовності операторівнеобхідну кількість разів. Існують три форми запису оператора циклу LOOP.

У першому варіанті умова завершення циклу знаходиться всередині т іла циклу і формується задопомогою ключових слів EXIT і WHEN.

LOOPпослідовність операторів[EXIT [WHEN умова]];END LOOP;

У другому варіанті повторення операторів здійснюється до тих пір, поки залишаєтьсяістинною умова, зазначена в початковому рядку оператора LOOP. Додатково може бутисформована ще одне умова виходу з циклу за допомогою ключового слова EXIT.

WHILE умова LOOPпослідовність операторів[EXIT [WHEN умова]];END LOOP;

У третьому варіанті змінна циклу пробігає вказаний діапазон значень від нижньої межі доверхньої, збільшуючи кожен раз своє значення на одиницю, після чого здійснюється вихід зциклу.

FOR змінна_ціклуIN [REVERSE] нижня_границя..верхня_границяLOOPпослідовність операторівEND LOOP;

Змінна циклу визначається системою неявно як змінна типу BINARY_INTEGER і не вимагаєоголошення. Значеннями границь можуть бути змінні, константи, вирази. Варіант REVERSEозначає, що значення проглядаються в зворотному порядку від верхньої границі до нижньої.

5.4 КУРСОРИДля виконання команди SELECT система виділяє певну область, куди поміщає крім службовоїінформації і самі вибрані рядки (активний набір рядків). У PL / SQL є спеціальна конструкція, якадозволяє задати ім’я цій області і здійснити доступ до збереженої там інформації. Такаконструкція називається курсором. Існують курсори двох типів: явні і неявні.

5.4.1. Явний курсор.Явний курсор повинен бути явно оголошений користувачем. Для його оголошеннявикористовується такий синтаксис:

CURSOR ім’я_курсору [(список_параметрів)] IS SELECT ...;Оператор SELECT визначає набір вибраних рядків. Список параметрів може бути відсутнім.

Основи мови PL/SQL 75

Page 76: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Якщо ж параметри використовуються, то вони описуються таким чином:Ім’я_параметра тип [{: = ⎪ DEFAULT} значення];

Якщо вказано значення параметра, то при відкритті курсору цей параметр можна невказувати.

Управління явним курсором здійснюється у двох варіантах: явно і неявно.При явній формі управління курсором необхідно явно відкрити курсор, явно вибрати рядки з

активного набору і явно закрити курсор.Для того щоб явно відкрити курсор, використовується така конструкція:

OPEN ім’я_курсору [(список_параметрів)];У момент відкриття курсору система виконує вказаний оператор SELECT з урахуванням

переданих значень параметрів, тобто вибирає відповідний набір рядків, і покажчик поточногозапису установлюється в цьому наборі на перший рядок. Однак рядки програмі не передаються.Щоб отримати рядки один за одним, використовується оператор FETCH. Вибірка рядківдопускається тільки в прямому напрямку; рух по набору рядків у зворотному напрямкунеможливий. Синтаксис оператора FETCH:

FETCH ім’я_курсору INTO {ім’я_запису | список_стовпців};При виконанні оператора FETCH вибирається черговий рядок, а покажчик поточного запису

пересувається на наступний рядок в наборі рядків. Якщо були обрані всі рядки, то при спробінового зчитування помилка не виникає, але і рядок не вибирається.

Для того щоб закрити курсор, необхідно виконати оператор:CLOSE ім’я_курсору;

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

1. % ISOPEN – повертає значення TRUE, якщо курсор відкритий, і FALSE, якщо курсорзакритий;

2. % FOUND – повертає значення TRUE, якщо рядок знайдений, і FALSE, якщо рядок незнайдений;

3. % NOTFOUND – повертає значення TRUE, якщо рядок не знайдений, і FALSE, якщо рядокзнайдена;

4. % ROWCOUNT – повертає числове значення, що показує кількість обраних рядків у курсорі.

При неявній формі управління курсором використовується спеціальна форма запису операторацикл FOR – цикли FOR з курсором. Відкриття, вибірка і закриття курсору в цьому випадкувідбувається автоматично.

Змінна-рядок, що повертається, визначається неявно і на неї не можна посилатися ззовніобласті видимості циклу. При неявній формі управління курсор може також мати параметри.

5.4.2. Неявні курсори.Неявні курсори створюються і відкриваються системою при виконанні операторів INSERT,UPDATE і DELETE, а також при виконанні однорядкового оператора SELECT. Неявний курсорназивається SQL-курсором. Він має свої атрибути, аналогічні атрибутам явного курсору: SQL%FOUND, SQL% NOTFOUND, SQL% ROWCOUNT

Однак у однорядковому операторі SELECT не можна використовувати атрибут SQL%NOTFOUND, бо якщо при його виконанні інформацію з таблиці не буде відображено, то згенеруєвиключення NO_DATA_FOUND. Атрибут SQL% NOTFOUND зазвичай використовується воператорах UPDATE і DELETE для перевірки, успішно чи ні виконані відповідні оператори.

Конструкція курсору дозволяє крім оперування наборами даних таблиць виконувати імодифікацію інформації таблиць. Для цього використовуються дві додаткових конструкції:

FOR UPDATE [OF стовпець1, стовпець2 ...] [NOWAIT]вказується в операторі SELECT, який визначає рядки активного набору, що формується, і

WHERE CURRENT OF ім’я_курсоруяка вказується в операторах UPDATE або DELETE, виконуваних в процесі вибірки і обробки

рядків з активного набору.У звичайній ситуації рядки, обрані в активний набір, що не блокуються, і будь-який інший

користувач може здійснити їх модифікацію в БД. Якщо після цього закрити і знову відкритикурсор, то отримуєш доступ до нових, модифікованих рядків.

При використанні варіанту FOR UPDATE з переліком стовпців блокується доступ іншихкористувачів до зазначених стовпців, але й оновлювати інформацію можна тільки в цихстовпцях. Якщо ж використовується FOR UPDATE без переліку стовпців, то блокується всятаблиця, а значить, оновлювати можна інформацію, що зберігається в будь-яких стовпцях

Основи мови PL/SQL 76

Page 77: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

таблиці.

5.5 ОБРОБКА ВИНЯТКОВИХ СИТУАЦІЙУ PL / SQL передбачені механізми перехоплення і обробки помилок, які виникають при виконанніпрограми. При виявленні помилки генерується виняткова ситуація, обробка якої виконується врозділі EXCEPTION. Існують два класи виняткових ситуацій: стандартні і визначені користувачем.

5.5.1. Стандартні виняткові ситуації.Стандартні виняткові ситуації поділяються на два типи: які мають і не маютьнапередвизначене ім’я. Мають напередвизначене ім’я виняткові ситуації крім коду мають ще йстандартне ім’я, яке використовується для ідентифікації винятку. Нижче наведені прикладидеяких стандартних виняткових ситуацій, що мають напередвизначені імена.

1. ZERO_DIVIDE – спроба поділу на нуль;2. NO_DATA_FOUND – речення SELECT ... INTO не повертає жодного рядка;3. TOO_MANY_ROWS – речення SELECT ... INTO повертає більше одного рядка;4. INVALID_CURSOR – спроба виконання забороненої операції з курсором (наприклад, закриття

невідкритого курсору);5. CURSOR_ALREADY_OPEN – спроба відкриття вже відкритого курсору;6. VALUE_ERROR – арифметична помилка, помилка перетворення усічення чи обмеження;7. INVALID_NUMBER – відмова в перетворенні рядка символів в число.

5.5.2. Користувальницькі виняткові ситуації.Користувальницькі виняткові ситуації описуються в реченні DECLARE, встановлюються ввиконуваному розділі, а оброблюються в розділі EXCEPTION. Опис користувальницької винятковоїситуації виконується завданням імені виключення і фрази EXCEPTION. Щоб згенерувативиняткову ситуацію і передати управління оброблювачу користувальницької винятковоюситуації в разі виявлення помилки, використовується оператор

RAISE ім’я_користувальницького_виняткуДля перехоплення виняткової ситуації будь-якого типу в розділ EXCEPTION повинна бути

включена фразаWHEN ім’я_винятку THEN текст_оброботчика_винятку;

Тоді при виникненні відповідної помилки, замість зупинення виконання програми і видачітипового повідомлення про помилку, буде виконуватися створений користувачем варіантобробки винятку. Якщо необхідно, щоб дві або більше виняткові ситуації оброблялися однаково,то вони повинні бути записані в одному операторі WHEN, розділені ключовим словом OR. Дляперехоплення всіх неописаних виняткових ситуацій використовується спеціальний обробникOTHERS, який записується останнім у розділі EXCEPTION.

Генерація виняткової ситуації з видачею відповідного повідомлення в робоче середовище вразі виявлення помилки може бути виконана за допомогою такого оператора:

RAISE_APPLICATION_ERROR (errnum, errtext);де errnum – код помилки, обираний в діапазоні -20000 .. -20999;errtext – пояснює символьний рядок довжиною до 512 байт.При виникненні виняткової ситуації і відсутності відповідного обробника в даному блоці

система намагається знайти такий обробник в блоках, що охоплюють цей блок. При відсутностіобробника система поверне помилку «необроблений виняток».

5.5.3. Приклади.Створити програму, яка здійснює в таблиці BOOKS підвищення цін на книги жанру«Фантастика». При цьому при вартості книги менш 200 грн, ціна збільшується на 20%, а привартості більше або рівний 200 грн – на 10%.

Дане завдання реалізується за допомогою явно оголошеного користувачем курсору. Прицьому в перших двох варіантах показуються можливості використання звичайного курсору ікурсору з параметром.

Наведене рішення демонструє два варіанти обробки явно оголошеного курсору: явну і неявнуформи. У явній формі обробки після закінчення перегляду рядків активного набору здійснюєтьсявихід з циклу обробки. При цьому використовується курсорний атрибут % NOTFOUND. У неявнійформі обробки курсору використовується конструкція циклу FOR з курсором. Модифіковане

Основи мови PL/SQL 77

Page 78: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

значення ціни записується назад в таблицю BOOKS з використанням конструкції WHERE CURRENTOF, при цьому системі за допомогою конструкції FOR UPDATE OF PRICE вказується, що будездійснюватися оновлення значень стовпця PRICE таблиці BOOKS. У програмі неявним способомоголошені змінна типу запис ZAP і скалярна змінна NEW_ PRICE.

а) Використання звичайного курсору:DECLARE CURSOR KUR IS -- явне оголошення курсору KUR SELECT CODE_BOOK, PRICE FROM BOOKS WHERE GENRE = ‘Фантастика’ FOR UPDATE OF PRICE; ZAP KUR% ROWTYPE; -- оголошення змінної-запису NEW_PRICE BOOKS.PRICE% TYPE; - оголошення змінноїBEGIN OPEN KUR; -- явне відкриття курсору LOOP FETCH KUR INTO ZAP; -- вибірка поточного запису EXIT WHEN KUR% NOTFOUND; - вихід з циклу IF ZAP.PRICE <2000 THEN -- зміна ціни NEW_PRICE: = ZAP.PRICE * 1.2; ELSE NEW_PRICE: = ZAP.PRICE * 1.1; END IF; UPDATE BOOKS SET PRICE = NEW_PRICE -- оновлення ціни WHERE CURRENT OF KUR;END LOOP; CLOSE KUR; -- явне закриття курсору COMMIT; -- завершення транзакціїEND; При запуску програми за допомогою SQL * PLUS, необхідно указати в рядку, наступним за

останнім оператором, косу риску (/), щоб програма виконалася.б) Використання курсору з параметром:DECLARE CURSOR KUR (GANR BOOKS.GENRE% TYPE) IS - курсор має параметр SELECT CODE_BOOK, PRICE FROM BOOKS WHERE GENRE = GANR FOR UPDATE OF PRICE; ZAP KUR% ROWTYPE; NEW_PRICE BOOKS.PRICE% TYPE;BEGIN OPEN KUR (‘Фантастика’); -- значення параметра LOOP FETCH KUR INTO ZAP; EXIT WHEN KUR% NOTFOUND; IF ZAP.PRICE <2000 THEN NEW_PRICE: = ZAP.PRICE * 1.2; ELSE NEW_PRICE: = ZAP.PRICE * 1.1; END IF; UPDATE BOOKS SET PRICE = NEW_PRICE WHERE CURRENT OF KUR; END LOOP; CLOSE KUR; COMMIT;END;в) Використання циклу FOR з курсором:DECLARE NEW_PRICE BOOKS.PRICE% TYPE; CURSOR KUR IS SELECT CODE_BOOK, PRICE FROM BOOKS WHERE GENRE = ‘Фантастика’ FOR UPDATE OF PRICE;BEGIN FOR ZAP IN KUR LOOP -- неявна обробка курсору IF ZAP.PRICE <2000 THEN -- змінна ZAP неявно оголошення системою NEW_PRICE: = ZAP.PRICE * 1.2;

Основи мови PL/SQL 78

Page 79: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

ELSE NEW_PRICE: = ZAP.PRICE * 1.1; END IF; UPDATE BOOKS SET PRICE = NEW_PRICE WHERE CURRENT OF KUR; END LOOP; COMMIT;END;

ВИСНОВКИPL / SQL – це розвинута мова програмування, що використовується для доступу до баз даних зрізних середовищ. PL / SQL інтегрована з сервером бази даних, тому програми PL / SQLобробляються швидко і ефективно. Ця мова доступна і в деяких клієнтських інструментальнихзасобах Oracle.

Мова програмування, що використовується для доступу до реляційних баз даних,називається мовою структурованих запитів (SQL, Structured Query Language). SQL – гнучка іефективна мова, всі засоби якої служать для маніпулювання реляційними даними і для їхдослідження.

PL / SQL означає Procedural Language / SQL (процедурна мова / SQL), розширює можливостіSQL, додаючи в нього такі конструкції процедурних мов, як:

Змінні і типи даних (як попередньо визначені, так і обумовлені користувачами);Керуючі структури, такі як умовні оператори та цикли;Процедури і функції;Об’єктні типи і методи.

Процедурні конструкції об’єднуються з Oracle SQL, що дає в результаті структуровану іефективну мову програмування.

Багато додатків для роботи з базами даних створюються з використанням моделіклієнт / сервер або трирівневої моделі. У моделі клієнт / сервер сама програма розміщується накомп’ютері клієнта і посилає запити на отримання інформації сервера бази даних.

Запити формуються за допомогою SQL, що створює в мережі велике число пересилань, поодному на кожен SQL-оператор (рис. 5.1). Однак кілька SQL-операторів можна об’єднати в одинблок PL / SQL і послати їх серверу як єдине ціле. В результаті мережевий трафік знижується, ідодаток функціонує набагато швидше.

Рисунок 5.1 – PL / SQL в середовищі клієнт-сервер

Тема 6Тригери бази даних 16Im Section 66.1 Призначення тригерів6.2 Створення і включення тригерів6.3 Класифікація тригерів.6.4 Порядок активізації тригерів.6.5 Тригерні предикати.6.6 Псевдозаписи.

Основи мови PL/SQL 79

Page 80: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

6.7 Включення, виключення і видалення тригерів.5.2 Приклади створення тригерівВисновки

ТЕМА 6ТРИГЕРИ БАЗИ ДАНИХ 16IM SECTION 6Тригер бази даних – це оформлений спеціальним чином іменований блок PL / SQL, що зберігаєтьсяв БД. Кожен тригер пов’язаний з визначеною таблицею і автоматично запускається привиконанні одного з DML-операторів (INSERT, DELETE, UPDATE) або їх сукупності над цієютаблицею.

6.1 Призначення тригерівТригери можуть бути використані:

для реалізації складних обмежень цілісності даних, які не можуть бути здійсненістандартним чином при створенні таблиці;запобігання невірних транзакцій;виконання процедур комплексної перевірки прав доступу та секретності даних;генерації деяких виразів на основі значень, наявних у стовпцях таблиць;при реалізації складних бізнес-правил для обробки даних (можливість відстежитионовлення даних у зв’язаних таблицях при зміні в одній з них).

6.2 Створення і включення тригерівДля створення і автоматичного включення тригера застосовується такий загальний синтаксис:

CREATE [OR REPLACE] TRIGGER ім’я_тригера{BEFORE | AFTER}{INSERT | DELETE | UPDATE [OF список_стовпців]}ON ім’я_таблиці [FOR EACH ROW] [WHEN умова]<PL / SQL_блок>При наявності ключових слів OR REPLACE тригер створюється заново, якщо він вже існує.Конструкція BEFORE | AFTER вказує на момент запуску тригера. Варіант BEFORE означає, що

тригер буде запускатися перед виконання активізуючого DML-оператора; варіант AFTERозначає, що тригер буде запускатися після виконання активізуючого DML-оператора.

Конструкція INSERT | DELETE | UPDATE [OF список_стовпців] вказує тип активізуючого тригерDML-оператора. Дозволяється, використовуючи логічну операцію OR, задати сукупністьактивізуючи операторів, наприклад INSERT OR DELETE. Якщо при використанні варіанта UPDATEвказаний список стовпців, то тригер буде запускатися при модифікації одного із зазначенихстовпців; якщо список стовпців відсутній, то тригер буде запускатися при зміні будь-якого ізстовпців пов’язаної з тригером таблиці.

Конструкція FOR EACH ROW вказує на характер впливу тригера: строковий або операторний.Якщо конструкція FOR EACH ROW присутня, то тригер є строковим; при відсутності її тригер єоператорних. Операторний тригер запускається один раз до або після виконання активізуючоготригер DML-оператора незалежно від того, скільки рядків у пов’язаної з тригером таблиціпіддалось модифікації. Строковий тригер запускається один раз для кожного з рядків, якіпіддаються модифікації DML-оператором, активізуючого тригер.

За допомогою ключового слова WHEN можна задати додаткове обмеження на рядкипов’язаної з тригером таблиці, при модифікації яких може бути запущений тригер.

Конструкція PL / SQL_блок представляє блок PL / SQL, який запускається при активізаціїтригера.

6.3 Класифікація тригерів.В основному розрізняють дванадцять типів тригерів. Тип тригера визначається поєднаннямнаступних трьох параметрів:

характером впливу тригера на рядки пов’язаної з ним таблиці (строковий абооператорний);моментом запуску тригера: до (BEFORE) або після (AFTER) виконання активізуючого тригер

Основи мови PL/SQL 80

Page 81: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

DML-оператора;типом активізуючого тригер DML-оператора (INSERT, DELETE, UPDATE).

6.4 Порядок активізації тригерів.Якщо у таблиці є декілька типів тригерів, то вони активізуються за такою схемою:

1. виконується операторний тригер BEFORE (якщо їх декілька, то нічого про порядок їхвиконання сказати не можна);

2. виконується строковий тригер BEFORE;3. виконується активізуючий тригер DML-оператор з наступною перевіркою всіх обмежень

цілісності даних;4. виконується строковий тригер AFTER з наступною перевіркою всіх обмежень цілісності

даних;5. виконується операторний тригер AFTER.

6.5 Тригерні предикати.Якщо в тригері вказується сукупність активізуючих тригер DML-операторів (наприклад, INSERTOR DELETE), то для розпізнавання того, який конкретно з DML-операторів виконується надпов’язаною з тригером таблицею, використовуються тригерні предикати: INSERTING, DELETING,UPDATING. Вони представляють собою логічні функції, які повертають TRUE, якщо типактивізуючого оператора збігається з типом предиката, і FALSE – в протилежному випадку. Длязавдання одних і тих же дій у разі виконання різних DML-операторів в умовному операторітригерні предикати об’єднуються за допомогою логічних операцій.

6.6 Псевдозаписи.Для строкових тригерів існують спеціальні конструкції, які дозволяють при виконанні DML-операторів над рядком таблиці звертатися як до старих значенням, які знаходились в ній домодифікації, так і до нових, які з’являться в рядку після її модифікації. Ці конструкціїназиваються псевдозаписами і позначаються old і new. Структура цих псевдозаписів ідентичнаструктурі рядка модифікуємої таблиці, але оперувати можна тільки окремими полямипсевдозапису. Звернення до полів псевдозапису відбувається за такою схемою: перед old абоnew ставиться символ двокрапка (:), далі через точку вказується назва поля. Значення, якіберуть поля псевдозапису при виконанні активізуючих DML-операторів, визначаються такимчином.

1. Оператор INSERT – псевдозапис: new еквівалентний рядку, що вставляється, апсевдозапис: old у всіх полях має значення NULL.

2. Оператор DELETE – псевдозапис: old еквівалентний рядку, що видаляється, а псевдозапис:new у всіх полях має значення NULL.

3. Оператор UPDATE – псевдозапис: new еквівалентний рядку, отриманому в результатімодифікації, а псевдозапис: old у всіх полях має початкове значення рядка.

6.7 Включення, виключення і видалення тригерів.Зберігаємий в БД тригер можна тимчасово відключити, не видаляючи його з БД. Для цьоговикористується наступна команда:

ALTER TRIGGER ім’я_тригера DISABLE;

Включити тригер через деякий проміжок часу можна, використовуючи командуALTER TRIGGER ім’я_тригера ENABLE;

Заборонити або дозволити запуск всіх тригерів, пов’язаних з деякою таблицею, можна задопомогою команди

ALTER TABLE ім’я_таблиці{DISABLE | ENABLE} ALL TRIGGERS;

де варіант DISABLE використовується для відключення, а варіант ENABLE – для включеннявсіх тригерів даної таблиці.

Основи мови PL/SQL 81

Page 82: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Видалення тригера з БД здійснюється за допомогою команди:

DROP TRIGGER ім’я_тригера;

Інформацію про тригери, які зберігаються в БД, можна отримати з подання словника данихUSER_TRIGGERS, наприклад, такою командою:

SELECT * FROM USER_TRIGGERS;

5.2 Приклади створення тригерів1. Створити тригер, який перед вставкою чергового рядка в таблицю BOOKS_DELIVERYперевіряє наявність зазначеного коду книги в таблиці BOOKS. При відсутності зазначеного кодукниги в таблиці BOOKS має генеруватися виняток з видачею відповідного повідомлення.

Додавання нових рядків таблицю BOOKS_DELIVERY виконується оператором INSERT. Оскількитригер повинен запускатися перед виконанням кожного оператора INSERT, отже, він повиненбути строковим BEFORE-тригером. Для збереження цілісності даних необхідно перевірити, чи єкоди книг в таблиці BOOKS, які мають бути внесені. Для цього за допомогою однорядковогооператора SELECT виконується вибірка інформації з таблиці BOOKS, де в умові вибіркивикористовується поле CODE_BOOK псевдозапису: new. Якщо кількість рядків з даними кодомкниги в таблиці BOOKS виявиться рівним нулю, буде згенеровано виняток і видано відповіднеповідомлення.

Створення тригера TR1 виконується введенням наступного оператора:

CREATE OR REPLACE TRIGGER TR1BEFORE INSERT ON BOOKS_DELIVERYFOR EACH ROWDECLAREQUANTITY NUMBER (4);BEGINSELECT COUNT (*) INTO QUANTITY FROM BOOKSWHERE CODE_BOOK =: NEW.CODE_BOOK;IF QUANTITY = 0 THEN RAISE_APPLICATION_ERROR(-20212, ‘У таблиці BOOKS немає інформації про дану книгу’);END IF;END TR1;

При створенні тригера за допомогою SQL*PLUS, необхідно вказувати в рядку, наступному заостаннім оператором, косу риску (/), щоб оператор CREATE ... TRIGGER виконався.

Дія тригера TR1 може бути перевірено виконанням наступного оператора, що здійснюєвставку рядка в таблицю BOOKS_DELIVERY і тим самим викликає активізацію тригера TR2:

INSERT INTO BOOKS_DELIVERY VALUES(21, 15, ‘Іванов І. І.’, 15, ‘20 -01-06 ‘);

Оскільки код книги 15 відсутній в таблиці BOOKS, то буде згенеровано виняток і видановідповідне повідомлення.

2. Створити тригер, який забороняє вносити в таблицю BOOKS рядки зі значенням поля PRICEбільше, ніж 500 грн., а також збільшувати ціни книг, інформація про яких зберігається в таблиціBOOKS, більш ніж на 20%. При порушенні даної вимоги має генеруватися виняток з видачеювідповідного повідомлення.

Так як внесення нових рядків таблицю BOOKS здійснюється в результаті виконанняоператора INSERT, а значення поля PRICE в таблиці BOOKS, що містить ціну книги, може бутизмінено в результаті виконання оператора UPDATE, то в тригері вказується сукупністьактивізуючих DML-операторів. Оскільки тригер повинен запускатися перед виконанням кожногоіз зазначених DML-операторів, він є строковим BEFORE-тригером. Так як дії, виконувані тригером,різні для кожного з активізуючих DML-операторів, що модифікують таблицю BOOKS, то длярозпізнавання типу DML-оператора використовуються відповідні тригерні предикати INSERTING іUPDAITING. Внаслідок того що при вставці нових рядків перевірці має бути піддано новезначення поля PRICE, а при модифікації значення поля PRICE нове значення повиннопорівнюватися зі старим значенням, необхідно використовувати псевдозаписи: new і old.

Створення тригера TR2 виконується введенням наступного оператора:

Основи мови PL/SQL 82

Page 83: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

CREATE OR REPLACE TRIGGER TR2BEFORE INSERT OR UPDATE OF PRICE ON BOOKSFOR EACH ROWBEGINIF INSERTING THENIF: NEW.PRICE> 5000 THENRAISE_APPLICATION_ERROR(-20102, ‘У таблицю BOOKS не можна вносити записи з ціною книги > 500’);END IF;END IF;IF UPDATING THENIF: NEW.PRICE>: OLD.PRICE * 1.2 THENRAISE_APPLICATION_ERROR(-20103, ‘У таблиці BOOKS не можна змінювати ціну книги більш ніж на 20% ‘);END IF;END IF;END TR2;

Дія тригера TR2 може бути перевірена виконанням таких операторів, які, здійснюючи вставкурядків таблицю BOOKS і оновлення рядків у таблиці BOOKS, тим самим викликають йогоактивізацію.

Оператор вставки рядків таблицю BOOKS, що активізує тригер TR2:

INSERT INTO BOOKS VALUES(21, ‘Дюна’, ‘Герберт Ф.’, 5268, ‘Аст’, ‘Фантастика’);

Оператор відновлення рядків в таблиці BOOKS, що активізує тригер TR2:

UPDATE BOOKS SET PRICE = 600;

Оскільки ці оператори порушують вимоги, пропоновані до значенням і модифікації ціни книг,то у всіх випадках буде згенеровано виняток і видано відповідне повідомлення.

ВисновкиТригери схожі на процедури і функції тим, що також є іменованими блоками PL / SQL і маютьрозділ оголошень, виконуваний розділ і розділ обробки виняткових ситуацій. Подібно модулям,тригери зберігаються як автономні об’єкти в базі даних і не можуть зберігатися локально вблоці або модулі. Процедура викликається явним чином з іншого блоку, при виклику їй можутьпередаватися різні аргументи. Тригер ж виконується неявно всякий раз, коли відбуваєтьсяактивізуюча його подія, і тригер не має аргументів. Процес виконання тригера називається йогоактивізацією (firing). Подією, що запускає тригер, є операція DML (INSERT, UPDATE або DELETE),виконувана над таблицею або поданням бази даних. У OracleSi ці функції розширені: тригерможе спрацьовувати на системну подія, наприклад на запуск або зупинку бази даних, а такожна певні види операцій DDL.

Тригери можна використовувати:

для реалізації складних обмежень цілісності даних, які неможливо реалізувати черездекларативні обмеження, що встановлюються при створенні таблиці.для контролю за інформацією, що зберігається в таблиці, за допомогою реєстраціївнесених змін і користувачів, які виконують ці зміни.для автоматичного оповіщення інших програм про те, що необхідно робити в разі зміниінформації, що міститься в таблиці.для публікації інформації про різні події в середовищі "публікація– підписка".

9

7.1 Типи процедур і функцій7.2 Створення збережених процедур і функцій7.3 Параметри процедур і функцій (підпрограм)7.3 Порядок завдання параметрів.7.4 Підпрограми і залежності. Перекомпіляція підпрограм

Основи мови PL/SQL 83

Page 84: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

7.5 Отримання інформації про збережені процедури і функції7.6 Приклади.

Функції та процедури (підпрограми) являють собою оформлені спеціальним чином іменованіблоки PL / SQL, які можуть бути викликані для виконання і яким можуть бути переданіпараметри. Як правило, процедури і функції реалізують певну закінчену дію над деякимиоб'єктами БД.

7.1 ТИПИ ПРОЦЕДУР І ФУНКЦІЙІснують два види процедур і функцій: локальні і збережені. Локальні процедури і функції можутьвикористовуватися тільки в тих блоках, де вони визначені. Збережені процедури і функціїкомпілюються і зберігаються в БД в скомпільованому вигляді. При необхідності вони можутьбути викликані для виконання анонімними і іменованими блоками PL / SQL, процедурами іфункціями обох видів, тригерами, а також з інтерактивного середовища SQL * PLUS.

Крім цього збережена функція може бути викликана і в операторі SQL.

7.2 СТВОРЕННЯ ЗБЕРЕЖЕНИХ ПРОЦЕДУР І ФУНКЦІЙДля створення збереженої процедури використовується наступний загальний синтаксис:

CREATE [OR REPLACE] PROCEDURE ім’я_процедури[(параметр1 [, параметр2, ...])] IS[розділ локальних оголошень]BEGINвиконуваний розділ[EXCEPTIONрозділ обробки виключень]END [ім'я процедури];

Для створення збереженої функції використовується наступний загальний синтаксис:

CREATE [OR REPLACE] FUNCTION ім’я_функції[(параметр1 [, параметр2, ...]] RETURN тип_даних IS[розділ локальних оголошень]BEGINвиконуваний розділ[EXCEPTIONрозділ обробки виключень]END [ім'я функції];

Збережені процедури і функції, що викликаються блоками PL / SQL, процедурами і функціями,

тригерами, викликаються завданням імені функції або процедури з вказівкою списку фактичнихпараметрів. Якщо викликається функція, то вона повинна бути частиною виразу; процедуравикликається як окремий оператор.

Для виклику з SQL * PLUS збереженої процедури використовується наступний синтаксисзапису:

EXECUTE ім’я_процедури (список_фактичних_параметрів);

Оскільки функція з інтерактивного редактора не може бути безпосередньо викликана, для її

виклику необхідно використовувати блок PL / SQL, анонімний або іменований, або оператор SQL.

7.3 ПАРАМЕТРИ ПРОЦЕДУР І ФУНКЦІЙ (ПІДПРОГРАМ)Для передачі інформації в підпрограму використовуються параметри. Змінні або вирази,перераховані в списку параметрів в специфікації підпрограми, називаються формальнимипараметрами, а перераховані в списку параметрів при виклику підпрограми називаютьсяфактичними аргументами. При виклику підпрограми фактичні аргументи обчислюються ірезультуючі значення присвоюються формальним параметрам, причому виконуються необхідніперетворення типів, тому формальні параметри та фактичні аргументи повинні мати суміснітипи.

Основи мови PL/SQL 84

Page 85: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Список параметрів є перерахування цих параметрів через кому. Кожен формальний параметрможе бути описаний таким синтаксисом:

Ім’я_параметра [вид] тип [{: = │DEFAULT} значення];

Параметр вид визначає режим передачі параметра. Є три режими передачі параметрів: IN (за

замовчуванням), OUT і IN OUT. Вони використовуються для позначення відповідності вхідних,вихідних і модифікованих параметрів. Бажано не використовувати режими OUT і IN OUT принаписанні функцій, щоб уникнути побічних ефектів.

Фактичний аргумент, що указується на місці IN-параметра, повинен бути константою,літералом, проініціалізованою змінної або виразом, і на відміну від OUT- і IN OUT-параметрів IN-параметр може мати значення за замовчуванням. Якщо параметр передається з варіантом IN,то в підпрограмі йому не можна присвоювати значення.

На місці OUT- або IN OUT-параметра може бути вказана тільки змінна. Як і змінні, OUT-параметри ініціалізуються NULL-значенням, і тип OUT-параметра не може бути підтипом,визначеним як NOT NULL. В іншому випадку генерується виключення VALUE_ERROR.

Якщо при виконанні процедури або функції виникають виняткові ситуації, то управлінняпередається до викликаючого блоку. Коли здійснюється нормальний вихід з підпрограми, тофактичним OUT- і IN OUT-аргументам присвоюються значення, а якщо виникають необробленівиключення, то значення не присвоюються.

Параметр тип визначає припустимий тип даних для параметра. В якості типу параметраможуть використовуватися практично всі основні типи даних мови. Однак якщовикористовуються типи CHAR, VARCHAR2 або NUMBER, то не можна вказувати розмірність дляцих типів даних, а для типу NUMBER – точність і масштаб..

7.3 ПОРЯДОК ЗАВДАННЯ ПАРАМЕТРІВ.При виклику підпрограм можна записати список фактичних аргументів, використовуючи абопозиційну, іменовану, змішану нотації, або передачу параметрів за замовченням:

позиційна нотація– це передача списку параметрів простим перерахуванням, причомутипи, кількість і порядок проходження параметрів повинні відповідати оголошенимраніше;в іменованої нотації стрілка => використовується як оператор асоціації, який пов'язуєформальний параметр зліва від стрілки з фактичним аргументом праворуч від неї. Приіменованій нотації параметри можуть вказуватися в будь-якому порядку;нотації можуть змішуватися (змішана нотація), але в цьому випадку позиційна вказівкапараметрів має передувати іменованій;існує можливість передачі параметрів за замовчуванням. При цьому формальнимпараметрам повинні бути привласнені значення або оператором присвоювання, або черезключове слово DEFAULT, і вони в списку фактичних параметрів повинні бути записаніостанніми.

7.4 ПІДПРОГРАМИ І ЗАЛЕЖНОСТІ. ПЕРЕКОМПІЛЯЦІЯ ПІДПРОГРАМЗбережені функції і процедури зберігаються в скомпільованому вигляді в БД. При цьому, якправило, їх виконання зачіпає деякі об'єкти БД. Для забезпечення достовірності роботи такихпроцедур або функцій система постійно відстежує для кожної процедури або функції станоб'єктів, з якими вона пов'язана. Якщо якийсь із пов'язаних з нею об'єктів піддаєтьсямодифікації за допомогою оператора DDL, то процедура або функція оголошується системоюнедійсною або недостовірною (INVALID). У цьому випадку процедуру або функцію, оголошенунедостовірною, треба обов'язково перекомпілювати.

Для того щоб перекомпілювати збережену процедуру, використовується команда:

ALTER PROCEDURE ім’я_процедури COMPILE; Команда ALTER FUNCTION перекомпілює збережену процедуру:

ALTER FUNCTION ім’я_функції COMPILE; Видалення підпрограм з БД здійснюється наступною командою:

Основи мови PL/SQL 85

Page 86: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

DROP {PROCEDURE │ FUNCTION} ім’я_підпрограми;

7.5 ОТРИМАННЯ ІНФОРМАЦІЇ ПРО ЗБЕРЕЖЕНІ ПРОЦЕДУРИ ІФУНКЦІЇІнформацію про процедури та функції можна отримати з подання словника даних USER_OBJECTS,наприклад, наступною командою:

SELECT * FROM USER_OBJECTS;

7.6 ПРИКЛАДИ.1. Створити збережену процедуру для підвищення вартості вкзаної книги в таблиці BOOKS на10 %. Параметр: код книги.

Варіант 1.CREATE OR REPLACE PROCEDURE INCREASE(CODE_BOOK BOOKS.CODE_BOOK%TYPE) ASQ NUMBER(1) := 0;BEGINSELECT COUNT(*) INTO Q FROM BOOKSWHERE BOOKS.CODE_BOOK = INCREASE.CODE_BOOK;IF Q <> 0 THENUPDATE BOOKS SET PRICE = PRICE + PRICE*0.1WHERE BOOKS.CODE_BOOK = INCREASE.CODE_BOOK;ELSERAISE_APPLICATION_ERROR(-20105, ‘В таблиці BOOKSвідсутня книга з зазначеним кодом’);END IF;END INCREASE;Виконання процедури INCREASE (варіант 1) реалізується оператором EXECUTE INCREASE (1);Варіант 2.CREATE OR REPLACE PROCEDURE INCREASE(CODE_BOOK BOOKS.CODE_BOOK%TYPE) ASBEGINUPDATE BOOKS SET PRICE = PRICE*1.1WHERE BOOKS.CODE_BOOK = INCREASE.CODE_BOOK;IF SQL%NOTFOUND THENRAISE_APPLICATION_ERROR(-20105, ‘В таблиці BOOKSвідсутня книга з зазначеним кодом’);END IF;END INCREASE;Виконання процедури INCREASE (варіант 2) реалізується оператором EXECUTE INCREASE (1);2. Створити збережену процедуру, що при надходженні книжок продавцю або додає вказану

кількість до кількості вже існуючих у продавця таких же книжок, поновлюючи відповіднийзапис в таблиці BOOKS_DELIVERY, або додає новий запис до таблиці BOOKS_DELIVERY, якщо упродавця книг такого найменування немає.

Параметри: код книги, кількість одиниць, прізвище продавця.Створення процедури:CREATE OR REPLACE PROCEDURE ADD_BOOKS(CODE_BOOK NUMBER, QUANTITY NUMBER,SALESMAN VARCHAR2) ISQ NUMBER(5) := 0;BEGINSELECT COUNT(*) INTO Q FROM BOOKS_DELIVERYWHERE BOOKS_DELIVERY.CODE_BOOK = ADD_BOOKS.CODE_BOOK AND

BOOKS_DELIVERY.SALESMAN = ADD_BOOKS.SALESMAN;IF Q <> 0 THENUPDATE BOOKS_DELIVERY SETQUANTITY = QUANTITY + ADD_BOOKS.QUANTITYWHERE BOOKS_DELIVERY.CODE_BOOK = ADD_BOOKS.CODE_BOOK AND

BOOKS_DELIVERY.SALESMAN = ADD_BOOKS.SALESMAN;

Основи мови PL/SQL 86

Page 87: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

ELSEINSERT INTO BOOKS_DELIVERY VALUES(CODE_OP.NEXTVAL,ADD_BOOKS.CODE_BOOK, ADD_BOOKS.SALESMAN,ADD_BOOKS.QUANTITY, SYSDATE);END IF;END ADD_BOOKS;Виконання процедури ADD_BOOKS реалізується такими операторами:EXECUTE ADD_BOOKS(1, 10, 'Іванов І. І.');EXECUTE ADD_BOOKS(5, 10, 'Іванов І. І.');При першому виклику процедури відбувається додавання 10 книжок до тих, що вже є у

вказаного продавця. При другому виклику до таблиці BOOKS_DELIVERY додається новий запис.

8.1 Структура пакета8.2 Створення і ініціалізація пакету8.3 Переваги пакетів.8.4 Залежності і перекомпіляція модуля

Ключові терміни:Пакет

Пакет (package) – це сукупність процедур, функцій та інших програмних об’єктів, призначенадля вирішення певного класу задач. Пакет дозволяє об’єднати і зберігати як окрему одиницю вбазі даних декілька різних елементів: процедур, функцій, типів даних, змінних, констант,курсорів, винятків. В цілому пакет можна розглядати як іменований розділ оголошень блоку.Розміщення типів, змінних, курсорів, процедур і функцій в заголовку пакета дозволяє посилатисяна них з інших блоків PL / SQL. На відміну від процедур і функцій, які можуть бути як локальними,так і збереженими, пакети ніколи не бувають локальними, а бувають тільки збереженими.Пакети також не можна вкладати один в одного, не можна викликати і пакетам не можнапередавати параметри.

8.1 СТРУКТУРА ПАКЕТАПакет або модуль, складається з двох різних частин: заголовка, або специфікації, пакета(package) і т іла (package body), кожна з яких зберігається окремо в словнику даних. Заголовокпакета описує його інтерфейс, тобто всі т і елементи, які можуть бути доступні всімкористувачам пакету. Оголошені в специфікації пакета об’єкти називаються загальними (public).Серед них присутні описи загальнодоступних типів і об’єктів та специфікації загальнодоступнихфункцій і процедур. До загальних об’єктів можна звертатися як ззовні пакету, так і з іншихоб’єктів в пакеті. Заголовок пакета створюється такою структурою:

CREATE [OR REPLACE] PACKAGE Ім’я_пакету {IS | AS}– – визначення типу;– – визначення змінної, константи;– – оголошення курсору;– – оголошення виняткової ситуації;– – оголошення функції;– – оголошення процедуриEND [Ім’я_пакету];

Наявність в заголовку модуля всіх вищеперелічених елементів необов’язково. Наприклад,

заголовок модуля може складатися тільки з оголошень процедур і функцій. Елементи пакетуможуть розміщуватися в ньому в будь-якому порядку, але якщо якісь елементи пакетупосилаються на інші об’єкти того ж пакету, то останні повинні бути оголошені до посилань на ціоб’єкти. Оголошення всіх процедур і функцій повинні бути попередніми, тобто на відміну відрозділу оголошень блоку, де можуть знаходитися як попередні оголошення, так і реальнітексти процедур і функцій, тут містяться тільки оголошення підпрограм.

Створимо заголовок пакета BOOKS_DELIV, помістивши в нього описи двох процедур і функції злекції 7.

CREATE OR REPLACE PACKAGE BOOKS_DELIV ISPROCEDURE INCREASE(CODE_BOOK NUMBER);PROCEDURE ADD_BOOKS (CODE_BOOK NUMBER,

Основи мови PL/SQL 87

Page 88: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

QUANTITY NUMBER, SALESMAN VARCHAR2);FUNCTION TEST_B (SALESMAN VARCHAR2) RETURN BOOLEAN;END BOOKS_DELIV;

Тіло пакета – це об’єкт словника даних, що зберігається окремо від заголовка пакета.Успішна компіляція тіла пакету можлива лише за умови успішної компіляції заголовка пакета. Тілопакета створюється такою структурою:

CREATE [OR REPLACE] PACKAGE BODY ім’я {IS | AS}– – опис закритих типів і об’єктів;– – визначення локальних функцій і процедур;– – визначення загальнодоступних функцій і процедур;END [ім’я];

Тіло пакета реалізує специфікацію пакета. У ньому мають бути описані всі процедури і функції,заздалегідь оголошені в заголовку пакета. При цьому обов’язково повинні збігатися назвипідпрограм, набір параметрів, порядок їх проходження і опис. Крім цього, можна такожоголосити і визначити додаткові об’єкти пакету, які називаються особистими (private) абозакритими. Так як особисті об’єкти оголошуються в тілі пакету, а не в його специфікації, до нихможна звертатися тільки з об’єктів пакета. Доступ до них з інших блоків PL / SQL неможливий.Тіло пакета не є обов’язковою його частиною і при відсутності в заголовку оголошень процедур іфункцій, т іло може бути відсутнім. У цьому випадку в заголовку пакета можна оголосити змінні,типи, курсори і виняткові ситуації, які будуть розглядатися як глобальні змінні і можуть неоголошуватися в використовують їх інших процедурах і функціях.

Створимо тіло пакету BOOKS_DELIV, помістивши в нього визначення двох процедур і функції злекції 7.

CREATE OR REPLACE PACKAGE BODY BOOKS_DELIV ISPROCEDURE INCREASE (CODE BOOK NUMBER) AS BEGINUPDATE BOOKS SET PRICE = PRICE * 1.1WHERE BOOKS.CODE_BOOK = INCREASE.CODE_BOOK;IF SQL% NOTFOUND THENRAISE_APPLICATION_ERROR(-20105, ‘У таблиці BOOKS відсутня книга з вказаним кодом’);END IF;END INCREASE;PROCEDURE ADD_BOOKS (CODE_BOOK NUMBER, QUANTITY NUMBER, SALESMAN

VARCHAR2) IS Q NUMBER (5): = 0;BEGINSELECT COUNT (*) INTO Q FROM BOOKS_DELIVERYWHEREBOOKS_DELIVERY.CODE_BOOK = ADD_BOOKS.CODE_BOOKANDBOOKS_DELIVERY.SALESMAN = ADD_BOOKS.SALESMAN;IF Q <> 0 THENUPDATE BOOKS_DELIVERY SET QUANTITY = QUANTITY + ADD_BOOKS.QUANTITY WHERE

BOOKS_DELIVERY.CODE_BOOK = ADD_BOOKS.CODE_BOOK ANDBOOKS_DELIVERY.SALESMAN = ADD_BOOKS.SALESMAN;ELSEINSERT INTO BOOKS_DELIVERY VALUES (CODE_OP.NEXTVAL,ADD_BOOKS.CODE_BOOK, ADD_BOOKS.SALESMAN, ADD_BOOKS.QUANTITY, SYSDATE);END IF;END ADD_BOOKS;FUNCTION TEST_B (SALESMAN VARCHAR2)RETURN BOOLEAN ISMIN_QUANTITY NUMBER (5): = 10;MAX_QUANTITY NUMBER (5): = 100;Q NUMBER (5);BEGINSELECT SUM (QUANTITY) INTO QFROM BOOKS_DELIVERYWHERE BOOKS_DELIVERY.SALESMAN = TEST_B.SALESMAN;RETURN (Q> = MIN_QUANTITY AND Q <= MAX_QUANTITY);END TEST_B;END BOOKS_DELIV;

При створенні специфікації або тіла пакету за допомогою SQL * PLUS, необхідно вказувати врядку, наступним за останнім оператором, косу риску (/), щоб оператор CREATE ... PACKAGEвиконався.

Основи мови PL/SQL 88

Page 89: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Процедури і функції модуля всередині модуля можуть бути перевантаженими. Це означає, щоможе існувати кілька процедур і функцій з одним і тим же ім’ям, але різними спискамипараметрів. Це дуже зручно, оскільки дозволяє виконувати одну і ту ж операцію над об’єктамирізних типів. У цьому випадку всі різні варіанти процедур або функцій описуються в заголовкупакета, а в його тілі розміщуються тексти цих підпрограм.

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

1. Не можна перевантажувати два підпрограми, якщо їх параметри відрізняються іменами.Наприклад, при наявності функції – FUNCTION AA (A1 IN NUMBER) не можна оголосити щеодну функцію – FUNCTION AA (K1 IN NUMBER).

2. Не можна перевантажувати два підпрограми, якщо їх параметри відрізняються видами.Наприклад, при наявності функції – FUNCTION AA (A1 IN NUMBER) не можна оголосити щеодну функцію – FUNCTION AA (A1 OUT NUMBER).

3. Забороняється перевантажувати функції, якщо типи параметрів відносяться до одногосімейства типів даних. Наприклад, типи CHAR і VAR- CHAR2 входять в одне і тежсімейство.

4. Не можна перевантажувати функції, якщо вони відрізняються лише типом даних, якіповертаються.

Будь-який об’єкт, оголошений в заголовку пакета, знаходиться в області дії, і видимий позамежами цього пакета. Для звернення до такого об’єкта необхідно перед ім’ям об’єкта вказатиім’я пакету, відокремивши його від імені об’єкта точкою (ім’я_пакета.ім’я_процедури абоім’я_пакета.ім’я_функції). Наприклад, процедуру INCREASE можна викликати з анонімного блокуPL / SQL таким чином:

BEGINBOOKS_DELIV.INCREASE (1);END;

Наведемо приклад виклику функції TEST_B.DECLARE ADD_SALESMAN VARCHAR2 (20);ADD_QUANTITY NUMBER (5);ADD_CODE_BOOK NUMBER (5);BEGINADD_SALESMAN: = ‘Іванов І. І.’;ADD_QUANTITY: = 20;ADD_CODE_BOOK: = 3;IF BOOKS_DELIV.TEST_B (ADD_SALESMAN)THEN UPDATE BOOKS_DELIVERY SET QUANTITY = QUANTITY + ADD_QUANTITYWHERE BOOKS_DELIVERY.CODE_BOOK = ADD_CODE_BOOK AND

BOOKS_DELIVERY.SALESMAN = ADD_SALESMAN;END IF;END;

При цьому виклик процедури аналогічний виклику звичайної збереженої процедури. Привиклику функцій і процедур пакету список параметрів підкорюється тим же умовам, що і списокпараметрів звичайних функцій і процедур. Для модульних підпрограм можуть задаватисяпараметри за замовчуванням, і викликати такі підпрограми можна за допомогою як позиційного,так і іменованого уявлення. Якщо процедура модуля використовує оголошення, задані взаголовку, то ці оголошення можна використовувати як з уточнюючими іменами, так і без них.

8.2 СТВОРЕННЯ І ІНІЦІАЛІЗАЦІЯ ПАКЕТУДля створення пакету необхідно виконати два окремих кроки:

1. Створити специфікацію пакета за допомогою команди CREATE PACKAGE. У специфікаціїпакета оголосити всі загальнодоступні програмні об’єкти.

2. Створити тіло пакету за допомогою команди CREATE PACKAGE BODY. У тілі пакетуоголосити і визначити програмні об’єкти двох типів:

загальнодоступні об’єкти, які були оголошені в специфікації пакету;закриті об’єкти пакету, до яких можна звертатися лише з інших об’єктів пакету, оскількиззовні вони недоступні.

Пакет зберігається в скомпільованому вигляді (р-код) в словнику даних і при зверненні до

Основи мови PL/SQL 89

Page 90: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

деякого елементу пакета в перший раз конкретизується (instantiated). Це означає, що пакетзавантажується в оперативну пам’ять, а потім запускається його р-код; при цьомуздійснюється ініціалізація пакету, при якій під змінні, визначені в пакеті, виділяється пам’ять.Модуль завжди зберігається в оперативній пам’яті в одному екземплярі, і у кожного сеансу,який використовує даний модуль, буде власна копія модульних змінних. Подібний підхідгарантує, що два сеанси, що виконують підпрограми одного і того ж модуля, будутьвикористовувати різні області пам’яті.

8.3 ПЕРЕВАГИ ПАКЕТІВ.Використання пакетів є альтернативою створенню процедур і функцій як незалежних об’єктівсхем. Пакети мають переваги перед незалежними процедурами і функціями:

1. Дозволяють інкапсулювати логічно пов’язані підпрограми і змінні, які відповідають одномуабо декільком додаткам, що сприяє більш ефективній реалізації програмних продуктів.

2. Поділ оголошень процедур, змінних, констант і курсорів на загальнодоступні та особистідозволяє приховувати деталі реалізації окремих підпрограм пакета.

3. Коли яка-небудь процедура пакету викликається в перший раз, весь пакет цілкомзавантажується в пам’ять. Це виконується як одна операція, на відміну від окремихоперацій завантаження, виконуваних для збережених процедур.

4. Організація модуля дозволяє модифікувати об’єкти всередині пакетів без перекомпіляціїзалежних об’єктів схем. Отже, можна змінити тіло модуля, не змінюючи його заголовка, щоі є перевагою пакета. При цьому інші об’єкти, що залежать від заголовка модуля,перекомпільовувати не треба. Крім цього, пакети зупиняють каскадні залежності і тимсамим уникають зайвих перекомпіляцій.

5. Пакети можуть містити глобальні змінні і курсори, які існують протягом усього сеансу ідоступні всім процедурам і функціям користувача. У кожний момент часу зберігаєтьсяодна копія пакету, яка використовується різними сеансами.

8.4 ЗАЛЕЖНОСТІ І ПЕРЕКОМПІЛЯЦІЯ МОДУЛЯЯк зазначалося раніше, пакети зберігаються в скомпільованому вигляді в словнику даних. Прицьому, як правило, їх виконання зачіпає деякі об’єкти БД. Для забезпечення достовірностіроботи пакету система постійно відстежує для кожного елемента пакету стан об’єктів, з якимивін пов’язаний. При цьому слід мати на увазі, що тіло модуля залежить від використовуванихоб’єктів і від заголовка пакету, а заголовок не залежить ні від чого. При зміні заголовка тілопакета автоматично стає недостовірним. Якщо якийсь з пов’язаних з пакетом об’єктівпіддається модифікації за допомогою одного з наступних операторів DDL (ALTER, DROP,REPLACE), то тіло пакету оголошується системою недійсним або недостовірним (INVALID). Уцьому випадку пакет, оголошений недостовірним, після усунення причин, що викликали такуситуацію, треба обов’язково перекомпілювати.

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

ALTER PACKAGE Ім’я_пакету COMPILE; Видалення пакета або однієї з його частин з БД здійснюється такою командою:

DROP {PACKAGE I PACKAGE BODY} Ім’я_пакету; Визначити достовірність об’єктів можна, використовуючи такий оператор:

SELECT OBJECT_NAME, OBJECT_TYPE, STATUSFROM USER_OBJECTS WHERE OBJECT_NAME IN (‘BOOKS’,‘BOOKS_DELIVERY’, ‘BOOKS_DELIV’);

9.1 Створення об’єктного типу9.2 Оголошення і ініціалізація об’єктів9.3 Ключове слово SELF.9.4 Розміщення об’єктів в базі даних9.5 Операції REF і DEREF.9.6 Методи MAP і ORDER9.7 Зміна та видалення типів

У СУБД Oracle забезпечується можливість створення, зберігання об’єктних даних і роботи з

Основи мови PL/SQL 90

Page 91: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

ними. Управління об’єктними даними аналогічно управлінню реляційними даними. Дляманіпулювання як реляційними, так і об’єктними даними в об’єктно-реляційної базі даних Oracleвикористовуються мови SQL і PL / SQL.

Об’єкти (objects) являють собою сукупність даних, об’єднаних з методами обробки цих даних,і відображають властивості реальних сутностей і операції, що виконуються над цимисутностями. Дані, що входять в об’єкт, носять назву атрибутів або властивостей. В якостіметодів, як правило, використовують процедури і функції. Управління атрибутами об’єктаздійснюється тільки через методи.

Для роботи з об’єктами спочатку необхідно визначити об’єктний тип (object type), який описуєатрибути і методи конкретного виду об’єктів, після чого можна оголошувати змінні, абоекземпляри, даного типу. Кожен екземпляр має власну область пам’яті і копію атрибутівоб’єкта.

При оголошенні об’єктних типів як параметр можна використовувати раніше створені об’єктнітипи. Створені об’єктні типи можуть бути типом для змінних, використовуватися як атрибутівдля інших типів, бути рядком в таблиці, бути стовпцем в таблиці, можуть бути частиноюоб’єктного подання.

9.1 СТВОРЕННЯ ОБ’ЄКТНОГО ТИПУОб’єктний тип складається:

з опису (заголовка, специфікації) об’єктного типу;тіла об’єктного типу.

В описі типу містяться атрибути і попереднє оголошення методів, а тіло складається звизначень методів. Кожна з цих частин компілюється окремо, але поки не буде скомпільованийзаголовок об’єктного типу, не буде компілюватися і його тіло.

Для створення заголовка об’єктного типу використовується такий синтаксис:CREATE [OR REPLACE] TYPE [схема.] ім’я_типу AS OBJECT(ім’я_атрібута тип_даних [, ім’я_атрібута тип_даних] ...][{MAP | ORDER} MEMBER опис_функції][MEMBER {опис_процедури | опис_функції}[, MEMBER {опис_процедури | опис_функції}] ...][PRAGMA RESTRICT_REFERENCES (ім’я_метода, обмеження)[, PRAGMA RESTRICT_REFERENCES (ім’я_метода, обмеження)]...]...);

де ім’я_типу – ім’я нового об’єктного типу, а схема – його власник.Спочатку через кому перераховуються атрибути типу:

ім’я_атрибута тип_данихд е імя_атрібута – це ім’я атрибута, а тип_даних – вбудований тип PL / SQL, або раніше

визначений користувачем тип даних, або посилання на об’єктний тип. Після атрибутіввказуються методи об’єктного типу. При описі методів кожен з них, крім останнього,відокремлюється комою і виглядає як звичайна збережена підпрограма PL / SQL з додаваннямключового слова MEMBER.

Прагма RESTRICT_REFERENCES використовується для визначення порядку виклику методу зSQL-оператора.

Для створення тіла об’єктного типу використовується такий синтаксис:CREATE [OR REPLACE] TYPE BODY ім’я_типу AS[{MAP | ORDER} MEMBER визначення_функції][MEMBER { визначення_процедури | визначення_функції}[MEMBER { визначення_процедури | визначення_функції}] ...]END;

причому в тілі об’єктного типу повинні бути реалізовані всі оголошені в заголовку процедури іфункції.

Зауваження:

1. При створенні специфікації або тіла пакету за допомогою SQL * PLUS, необхідно вказуватив рядку, наступним за останнім оператором, косу риску (/), щоб оператор CREATE ... TYPEвиконався.

2. Опис атрибутів виконується так само, як і опис полів типу запису PL / SQL або стовпцівтаблиці в операторі CREATE TABLE, але на відміну від полів запису атрибути об’єктноготипу можна обмежувати як NOT NULL і ініціалізувати значеннями за замовчуванням.

3. Так як об’єктні типи зберігаються в словнику даних, то типи даних для атрибутів повиннібути тільки ті, які є в мові SQL, за винятком типів даних: LONG, LONG RAW, NCHAR, NVAR-

Основи мови PL/SQL 91

Page 92: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

CHAR2, NCLOB і ROWID.4. Не допускається використання типів даних, доступних в мові PL / SQL: BINARY_INTEGER,

BOOLEAN, PLS_INTEGER, RECORD, REF CURSOR.5. Забороняється використання в атрибутах об’єктного типу атрибутів % TYPE та% ROWTYPE,

але дозволяється використання атрибуту % TYPE з атрибутами примірника об’єктноготипу.

6. Функції MAP і ORDER використовуються для завдання порядку сортування в даномуоб’єктному типі. Ці функції обговорюються нижче.

7. Допускається створення об’єктних типів шляхом попереднього оголошення типу, якеаналогічно попередньою оголошеної процедури або методу:

CREATE TYPE ім’я_типу;

8. Тіло об’єктного типу не може містити оператори тих методів, які не вказані в специфікаціїтипу.

Створимо об’єктний тип для сутності «книга». Атрибутами даного типу є код книги, назвакниги, прізвище автора, ціна книги. Оголосимо два методи: FORMATTED_NAME і CHANGE_PRICE,перший з яких повертає прізвище автора і назву книги, а другий оновлює поле PRICE значенням,зазначеним у поле NEW_PRICE. Як ім’я об’єктного типу використовуємо ідентифікатор BOOK_T.Наступна послідовність операторів створює специфікацію об’єктного типу BOOK_T.

CREATE OR REPLACE TYPE BOOK_T AS OBJECT(ID NUMBER (2), – код книгиTITLE VARCHAR2 (15), – назва книгиAUTHOR VARCHAR2 (15), – прізвище автораPRICE NUMBER (7), – ціна книгиMEMBER FUNCTION FORMATTED_NAME RETURN VARCHAR2,MEMBER PROCEDURE CHANGE_PRICE (NEW_PRICE IN NUMBER));

Створимо тіло об’єктного типу BOOK_T:

CREATE OR REPLACE TYPE BODY BOOK_T AS MEMBER FUNCTION FORMATTED_NAMERETURN VARCHAR2 IS

BEGINRETURN SELF.AUTHOR ║ SELF.TITLE;

END FORMATTED_NAME;MEMBER PROCEDURE CHANGE_PRICE (NEW_PRICE IN NUMBER) ISBEGIN

PRICE: = NEW_PRICE;END CHANGE_PRICE;END;

9.2 ОГОЛОШЕННЯ І ІНІЦІАЛІЗАЦІЯ ОБ’ЄКТІВЯк і інші змінні PL / SQL, об’єкт описується в розділі оголошень блоку, після імені об’єктавказується відповідний тип. Наприклад:

DECLARE BOOK BOOK_T;BEGIN NULL;END;

У цьому блоці BOOK описується як екземпляр об’єктного типу BOOK_T. За правилами PL / SQL

екземпляр об’єкта, оголошений таким чином, ініціалізується NULL-значенням, тобтостворюється NULL- об’єкт, на атрибути якого посилатися не можна. Подібна спроба призведедо помилки. У наступному прикладі система видасть помилку «Посилання на неініціалізованийскладений тип»:

DECLARE BOOK BOOK_T;BEGIN

BOOK. TITLE: = ‘Війна і мир’;

Основи мови PL/SQL 92

Page 93: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

END; Для ініціалізації об’єктів використовується спеціальна функція-конструктор (constructor), що

повертає ініціалізований об’єкт. Система створює функцію-конструктор за замовчуванням, ім’яфункції збігається з ім’ям об’єктного типу, а список параметрів – зі списком атрибутів.

На атрибути об’єкта, як і на поля запису, можна посилатися, використовуючи уточнююще ім’я,яке записується перед ім’ям атрибута через крапку. Створимо ініціалізований екземпляр типуBOOK_T і змінимо значення атрибута TITLE.

DECLAREBOOK BOOK_T: = BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000);BEGINBOOK.TITLE: = ‘Війна і мир’;END;

Щоб перевірити, є об’єкт NULL-об’єктом чи ні, використовується умова IS NULL. Наприклад:

DECLAREBOOK BOOK_T: = BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000);BEGINIF BOOK IS NULLTHEN RAISE_APPLICATION_ERROR (-20000, ‘BOOK IS NULL’);ELSEBOOK.TITLE: = ‘Лють’;END IF;END;

Після створення кожен екземпляр об’єкта знаходиться в певному, властивому тільки йому

стані. Для модифікації його стану використовуються методи об’єкта, які повинні посилатися наконкретний екземпляр об’єкта. Отже, для виклика методу потрібно використовувати наступнийсинтаксис:

ім’я_об’єкта.ім’я_метода

де ім’я_об’єкта – ім’я об’єктної змінної, а ім’я_метода – ім’я методу, який викликається. Якщо

метод не містить аргументів, його можна викликати без круглих дужок, як і звичайну процедуруPL / SQL, або з дужками і порожнім списком аргументів. Це продемонстровано на прикладінаступного блоку PL / SQL. Для перевірки правильності роботи методів створимо спеціальнутаблицю TEST_T, що містить два поля: прізвище автора і назву книги, ціну книги.

CREATE TABLE TEST_T (FORM VARCHAR2 (40),PRICE NUMBER (7));DECLAREBOOK1 BOOK_T: = BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000);BOOK2 BOOK_T: = BOOK_T (20, ‘Війна і мир’, ‘Толстой Л.’, 15000);FORM1 VARCHAR (40);FORM2 VARCHAR (40);BEGIN– Змінює значення атрибута PRICE.BOOK1. CHANGE_PRICE (7000);BOOK2. CHANGE_PRICE (17000);– Вибираємо прізвище автора і назву книги.FORM1: = BOOK1.FORMATTED_NAME;FORM2: = BOOK2.FORMATTED_NAME ();– Отримані дані поміщаємо в таблицю TEST_T.INSERT INTO TEST_T VALUES (FORM1, BOOK1.PRICE);INSERT INTO TEST_T VALUES (FORM2, BOOK2.PRICE);END;

Здійснити перевірку правильності роботи методів можна, вибравши з таблиці TEST_T

інформацію оператором

SELECT * FROM TEST_T;

Основи мови PL/SQL 93

Page 94: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Все, що стосується списку параметрів, підпорядковане тим же правилам, що і длязбережених процедур і функцій. Методи можна викликати з використанням як іменного, так іпозиційного подання, а їх параметри можуть мати значення за замовчуванням. Методи можутьбути перевантажені. Можна перевизначити тип і число аргументів методу. Якщо в моментвиконання методу виникає виняток, то процедура завершує свою роботу, причому вихіднимпараметрам типу OUT і IN OUT нічого не присвоюється; якщо ж були виконані якісь зміни в SELF,то вони також ліквідуються

9.3 КЛЮЧОВЕ СЛОВО SELF.Розглянемо метод CHANGE PRICE:

MEMBER PROCEDURE CHANGE PRICE(NEW PRICE IN NUMBER) ISBEGIN

PRICE: = NEW_PRICE;END CHANGE_PRICE;

Цей метод викликається для модифікації атрибуту PRICE типу BOOK_T. Для автоматичної

прив’язки ідентифікатора PRICE до примірника об’єкта всередині методу застосовуєтьсяключове слово SELF, тобто в даному випадку замість оператора

PRICE: = NEW_PRICE;можна було написати операторSELF.PRICE: = NEW_PRICE;При передачі ж поточного екземпляра об’єкта іншій процедурі або функції як аргумент

необхідно вказувати SELF. Наведемо приклад:

MEMBER PROCEDURE CHANGE_PRICE_ANOTHER(BOOK BOOK_T) ISBEGINSELF.PRICE: = BOOK.PRICE;END CHANGE_PRICE_ANOTHER;

9.4 РОЗМІЩЕННЯ ОБ’ЄКТІВ В БАЗІ ДАНИХУ PL / SQL є можливість для створення об’єктів двох типів: стійких і нестійких, що визначає їхвластивості, а також операції, які дозволено виконувати над ними. Стійким (persistent) об’єктомназивається об’єкт, що зберігається в базі даних, а нестійким (transient) – об’єкт, оголошенийлокально в блоці PL / SQL. Із завершенням роботи блоку PL / SQL нестійкий об’єкт руйнується.Стійкий об’єкт залишається доступним до тих пір, поки не буде видалений явним чином.Наведемо приклад нестійкого об’єкта BOOK:

DECLAREFORM1 VARCHAR2 (40);– Створення об’єкта.BOOK BOOK_T: = BOOK_T (10, ‘Війна і мир’, ‘Толстой Л.’, 5000);BEGINBOOK.CHANGE_PRICE (7000);FORM1: = BOOK.FORMATTED_NAME;– Занесення значень атрибутів TITLE, AYTHOR, PRICE– В таблицю TEST_T;INSERT INTO TEST_T VALUES (FORM1, BOOK.PRICE);END;

По завершенні роботи блоку об’єкт BOOK буде зруйнований. Збережеться лише інформація,занесена в таблицю TEST_T.

Стійкі об’єкти зберігаються в таблицях бази даних, як і стандартні скалярні типи. Існує дварізні способи зберігання об’єктів в таблиці: як об’єкт-рядок або як об’єкт-стовпець.

Об’єкт-рядок (row object) займає цілий рядок таблиці бази даних, причому в рядку не повинноміститися інших полів. Таблиця, що складається з таких рядків, називається об’єктною (objecttable) і створюється за допомогою такого оператора:

CREATE TABLE ім’я_таблиці OF об’єктний_тип;

Основи мови PL/SQL 94

Page 95: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

де ім’я_таблиці – це ім’я створюваної таблиці, а об’єктний_тип – тип об’єкта-рядка. Як

приклад створимо об’єктну таблицю BOOK_S на базі об’єктного типу BOOK_T:

CREATE TABLE BOOK_S OF BOOK_T; У кожному рядку таблиці BOOK_S знаходиться екземпляр типу рядка BOOK_T, атрибути якої

визначені в об’єктному типі BOOK_T. Отже, в цю таблицю можна вводити тільки об’єкти. Нижченаведено ряд прикладів введення об’єктів в таблицю BOOK_S. Як вказувалося вище вставканових значень в таблицю здійснюється через функцію-конструктор.

INSERT INTO BOOK_SVALUES (BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000));INSERT INTO BOOK_SVALUES (BOOK_T (20, ‘Війна і мир’, ‘Толстой Л.’, 15000));

Об’єктні таблиці дуже схожі на звичайні реляційні таблиці. Тому при заповненні об’єктної

таблиці з метою поєднання зі звичайними реляційними таблицями, які були до цього в БД,допускається і звичайна вставка за умови, що в списку атрибутів немає інших вбудованихоб’єктних типів. Наприклад, можна ввести дані в таблицю BOOK_S за допомогою такогооператора INSERT:

INSERT INTO BOOK_SVALUES (30, ‘Дюна’, ‘Герберт Ф.’, 8000);

Під час такої модернізації різні реляційні таблиці можна створити заново як об’єктні, причому

існуючі програми змінювати зовсім не обов’язково.Операції DML, що виконуються над таблицями, в яких містяться об’єкти-рядки, абсолютно

ідентичні реляційним операціями DML.В операторах UPDATE і DELETE можна вказувати об’єкти як змінні прив’язки. У цьому випадку

операції DELETE і UPDATE можна виконувати, як над звичайними реляційними таблицями.Покажемо це на прикладах:

UPDATE BOOK_S SET TITLE = ‘Діти Дюни’ WHERE ID = 30;DELETE FROM BOOK_S WHERE ID = 30;

У запиті об’єкт-рядок може поводитися по-різному. Якщо просто написати оператор виводу

інформації, перерахувавши всі потрібні атрибути, то система буде розглядати їх як звичайнийнабір атрибутів, а не об’єкт, оскільки об’єктна таблиця описується точно так само, як іреляційна. Тому для вибору об’єкта потрібно використовувати операцію VALUE.

Операція VALUE (значення) повертає об’єкт. Як аргумент VALUE використовується зміннакореляції, яка в даному контексті являє собою псевдонім таблиці. Використання VALUE ізвичайного варіанта запиту ілюструється в наступному прикладі:

DECLARECURRENT_ID BGGK_S.ID% TYPE;CURRENT_TITLE BGGK_S.TITLE% TYPE;CURRENT_AUTHGR BGGK_S.AUTHGR% TYPE;CURRENT_PRICE BGGK_S.PRICE% TYPE;CURRENT_BGGK BGGK_T;BEGINSELECT * INTG CURRENT_ID, CURRENT_TITLE,CURRENT_AUTHGR, CURRENT_PRICE FRGM BGGK_SWHERE ID = 10;SELECT VALUE (B) INTG CURRENT_BGGK FRGMBGGK_S B WHERE ID = 10;END;

При формуванні об’єктної таблиці, де об’єкти – рядки, кожному об’єкту присвоюється

ідентифікатор. Ідентифікатор об’єкта – це унікальний покажчик на стійкий об’єкт конкретноготипу, який однозначно визначає об’єкт. Ідентифікатори об’єктів унікальні по всьому просторуБД Oracle: два об’єкти не можуть мати один і той же ідентифікатор. Якщо навіть об’єктвидаляється, цей номер ніякому іншому об’єкту ніколи не присвоюється. Ідентифікатор об’єкта –

Основи мови PL/SQL 95

Page 96: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

це внутрішньосистемна структура; загальне число ідентифікаторів становить 2128 різнихзначень.

Ідентифікатори об’єкта є тільки у об’єктів-рядків і рядків об’єктних подань. Якщо об’єкт маєідентифікатор, на цей об’єкт можна посилатися. Посилання на об’єкт описується в розділіоголошень або вказується в описі таблиці і виглядає наступним чином:

ім’я_змінної REF об’єктний_тіп,

де ім’я_змінної – це ім’я посилання на об’єкт, а об’єктний_тіп – визначений раніше об’єктний

тип.Посилання на об’єкти можна вказувати в блоках PL / SQL і в SQL- операторах, використовуючи

при цьому операції VALUE і REF.

9.5 ОПЕРАЦІЇ REF І DEREF.Результатом виконання операції REF (аргумент) є посилання на запитуваний об’єкт. Як і дляVALUE, аргумент REF – це змінна кореляції. Наведемо приклад, в якому вибирається посиланняна рядок таблиці з конкретним значенням атрибуту ID:

DECLARE CURRENT_BOOK_REF REF BOOK_T;BEGIN

SELECT REF (B) INTO CURRENT_BOOK_REFFROM BOOK_S BWHERE ID = 10;

END; Операція DEREF (посилання) повертає вихідний об’єкт за заданим на нього посиланням.

Продовжимо попередній приклад, в якому оновимо значення атрибута TITLE в об’єкта, обраногоза посиланням:

DECLARE CURRENT_BOOK_REF REF BOOK_T;

CURRENT_BOOK BOOK_T;BEGIN

SELECT REF (B) INTO CURRENT_BOOK_REFFROM BOOK_S BWHERE ID = 10;SELECT DEREF (CURRENT_BOOK_REF) INTO CURRENT_BOOKFROM DUAL;CURRENT_BOOK.TITLE: = ‘Анна Кареніна’;

END; Якщо об’єкт, на який вказує REF, видалений, то посилання називають висячим (dangling),

оскільки тепер він вказує на неіснуючий об’єкт. Використовувати операцію DEREF для висячоїпосилання можна. Щоб перевірити, чи не є посилання висячим, застосовується предикат ISDANGLING. Всі розглянуті операції (VALUE, REF, DEREF і IS DANGLING) можна використовуватитільки в SQL-операторах. У процедурних операторах це заборонено.

У операторах INSERT і UPDATE використовується конструкція - RETURNING.Вона застосовується для зчитування інформації з нововведеної або оновленого рядка; при

цьому формувати додатковий запит не потрібно. Синтаксис конструкції RETURNING такий:

RETURNING список_вибору INTO список_ввода; де список_вибора аналогічний списку вибору запиту, а список_ввода – це те ж саме, що і

оборот INTO запиту. Наприклад, якщо в об’єктню таблицю вводиться деякий об’єкт, то можнаповернути посилання на знову введений об’єкт таким чином:

DECLARE

CURRENT_BOOK_REF REF BOOK_T;BEGIN

INSERT INTO BOOK_S B VALUES(BOOK_T (40, ‘Гравець’, ‘Достоєвський Ф.’, 3000))RETURNING REF (B) INTO CURRENT_BOOK_REF;

END;

Основи мови PL/SQL 96

Page 97: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Об’єкт-стовпець (column object) займає рівно один стовпець таблиці. Для створення таблиці,

яка містить об’єкт-стовпець, потрібно просто вказати об’єктний тип в якості типу стовпця воператорі CREATE TABLE. Допускається в такій таблиці наявність і скалярних типів. Дляприкладу створимо таблицю BOOK_DELIVERY на базі описаного вище типу BOOK_T:

CREATE TABLE BOOK_DELIVERY(SALESMAN VARCHAR2 (15),QUANTITY NUMBER (7),BOOK BOOK_T);

Таблиця BOOK_DELIVERY складається з трьох стовпців, один з яких є об’єктним типом. В

даному випадку ввести інформацію в таблицю без конструктора не можна, тобто для введеннянових значень необхідно використовувати наступну конструкцію:

INSERT INTO BOOK_DELIVERYVALUES (‘Іванов І. І.’, 5, BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000));

В іншому випадку буде видана помилка.Інформацію з таблиці можна вибрати звичайним способом за допомогою оператора SELECT:

SELECT * FROM BOOK_DELIVERY; На екран буде виведено:

Іванов І. І. 5 BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000)); Тобто стовпець BOOK_T розглядається як єдине ціле, звернутись безпосередньо до якогось

окремого елементу не можна.Крім того, можна послатися на об’єкт-стовпець в умові WHERE, вказавши перелік значень

атрибутів цього об’єкта. Нижче наведено прилад способу використання оператора SELECT.

SELECT SALESMAN FROM BOOK_DELIVERYWHERE BOOK = BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000);

Те ж саме стосується операторів DELETE, UPDATE.Відзначимо, що в блоці PL / SQL для виконання даного оператора для таблиці необхідно

вказати псевдонім.DECLARE

CURRENT_BOOK BOOK_T;BEGIN

SELECT BOOK INTO CURRENT_BOOKFROM BOOK_DELIVERY DWHERE D.BOOK.ID = 10;

END; Іноді на практиці такі таблиці, в яких є об’єкти-стовпці, враховуючи, що існує таблиця, де ці

рядки присутні, будують так. У стовпці вказується не об’єктний тип, а посилання на цей тип.

CREATE TABLE BOOK_DELIVERY_M(SALESMAN VARCHAR2 (15),QUANTITY NUMBER (7),BOOK REF BOOK_T);

Для вставки інформації в таку таблицю використовують наступну конструкцію:

INSERT INTO BOOK_DELIVERY_MSELECT ‘Іванов І. І.’, 5, REF (B)FROM BOOK_S BWHERE ID = 10;

Рядок з ID = 10 має унікальний ідентифікатор, який вибирається за допомогою операції REF

(B) і розміщується в стовпці. В даному випадку також необхідне використання синоніма. Для

Основи мови PL/SQL 97

Page 98: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

перегляду інформації таблиці можна використовувати наступний оператор:

SELECT * FROM BOOK_DELIVERY_M; Але в цьому випадку на екран виведеться замість третього атрибуту дуже довге число –

ідентифікатор об’єкта. Тому для видачі інформації краще використовувати наступний варіант:

SELECT SALESMAN, QUANTITY,DEREF (BOOK) FROM BOOK_DELIVERY_M;

У результаті отримаємо наступний рядок:

Іванов І. І. 5 BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000)); У даному випадку операція DEREF повертає об’єкт за посиланням. Якщо необхідно змінити

інформацію в таблиці, то оператор UPDATE записують в наступному вигляді:

UPDATE BOOK_DELIVERY_M SET SALESMAN = ‘Петров П. П.’WHERE DEREF (BOOK) = BOOK_T (10, ‘Козаки’, ‘Толстой Л.’, 5000);

9.6 МЕТОДИ MAP І ORDERМетоди MAP і ORDER – спеціальні методи, призначені для реалізації впорядкування створюванихна базі об’єктного типу реальних примірників об’єкта. При оголошенні об’єктного типу можнавикористовувати тільки один з цих методів. Коли створюється об’єкт, який є структурою, тонеобхідно визначити порядок перевірки умов, і саме MAP і ORDER встановлюють цей порядок.Якщо один з цих методів присутній, то можна здійснити порівняння об’єктів не тільки воператорах SQL, але і в операторах PL / SQL. Якщо їх немає, то об’єкти можна перевіряти тількина еквівалентність і т ільки в операторах SQL. Методи MAP і ORDER дають можливістьвпорядковувати об’єкти, а також порівнювати їх в процедурних операторах. Виклик будь-якогоз цих методів відбувається автоматично.

Метод MAP завжди представляється функцією, яка не має параметрів, і типом значення, щоповертається якої можуть бути тільки DATE, NUMBER, VARCHAR2. На підставі аналізу даногооб’єкта ця функція повертає значення зазначеного типу, яке може бути використано длявпорядковування об’єктів.

Нижче наведено приклад використання методу MAP для об’єктного типу BOOK_TM,аналогічного за структурою об’єктному типу BOOK_T.

Створимо заголовок об’єктного типу BOOK_TM.

CREATE OR REPLACE TYPE BOOK_TM AS OBJECT(ID NUMBER (2),TITLE VARCHAR2 (15),AUTHOR VARCHAR2 (12),PRICE NUMBER (7),MAP MEMBER FUNCTION RETURN_TITLERETURN VARCHAR2);

Створимо тіло об’єктного типу BOOK_TM.

CREATE OR REPLACE TYPE BODY BOOK_TM ASMAP MEMBER FUNCTION RETURN_TITLERETURN VARCHAR2 ISBEGIN

RETURN TITLE;END RETURN_TITLE;END;

Функція RETURN_TITLE повертає назву книги. Створимо об’єктну таблицю BOOK_K на базі

об’єктного типу BOOK_TM.

Основи мови PL/SQL 98

Page 99: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

CREATE TABLE BOOK_K OF BOOK_TM; Внесемо в таблицю BOOK_K такі записи за допомогою оператора INSERT:

INSERT INTO BOOK_K VALUES(BOOK_TM (10, ‘Козаки’, ‘Толстой Л.’, 5000));INSERT INTO BOOK_K VALUES(BOOK_TM (20, ‘Війна і мир’, ‘Толстой Л.’, 15000));INSERT INTO BOOK_K VALUES (30, ‘Дюна’, ‘Герберт Ф.’, 8000);

Після створення цієї таблиці для впорядкування виведених записів за назвою книг можна

виконати, наприклад, такий оператор SELECT:

SELECT VALUE (B)FROM BOOK_K BORDER BY TITLE;

В результаті чого буде виведена наступна інформація:

VALUE (B) (ID, TITLE, AUTHOR, PRICE)– – – –BOOK_TM (20, ‘Війна і мир’, ‘Толстой Л.’, 15000)BOOK_TM (30, ‘Дюна’, ‘Герберт Ф.’, 8000)BOOK_TM (10, ‘Козаки’, ‘Толстой Л.’, 5000)

Метод ORDER завжди має два параметри: перший є вбудованим (так званий SELF), а другий

параметр (об’єктного типу) передається в цю функцію. Метод ORDER повертає наступнізначення, за якими можна судити про співвідношення цих двох переданих функції об’єктів:

-1, якщо параметр більше SELF;1, якщо параметр менше SELF;0, якщо параметр дорівнює SELF.

Метод ORDER використовується аналогічно методу MAP. Створимо метод ORDER для об’єктаBOOK_TM; цей метод впорядковує відомості про книги за назвами книг. Створимо зановозаголовок об’єктного типу BOOK_TM.

CREATE OR REPLACE TYPE BOOK_TM AS OBJECT(ID NUMBER (2),TITLE VARCHAR2 (15),AUTHOR VARCHAR2 (12),PRICE NUMBER (7),ORDER MEMBER FUNCTION COMPARE_BOOKS(CUR_BOOK IN BOOK_TM)RETURN NUMBER);

Створимо заново тіло об’єктного типу BOOK_TM.

CREATE OR REPLACE TYPE BODY BOOK_TM ASORDER MEMBER FUNCTION COMPARE_BOOKS(CUR_BOOK IN BOOK_TM)RETURN NUMBER ISBEGIN

IF CUR_BOOK.TITLE = SELF.TITLE THEN RETURN 0;ELSIF CUR_BOOK.TITLE> SELF.TITLE THEN RETURN -1;ELSE RETURN 1;

END IF;END COMPARE_BOOKS;END;

Після створення методу ORDER виконаємо наступний оператор:

SELECT VALUE (B) FROM BOOK_K B ORDER BY TITLE; В результаті чого буде виведена наступна інформація:

Основи мови PL/SQL 99

Page 100: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

VALUE (B) (ID, TITLE, AUTHOR, PRICE)– – – –BOOK_TM (20, ‘Війна і мир’, ‘Толстой Л.’, 15000)BOOK_TM (30, ‘Дюна’, ‘Герберт Ф.’, 8000)BOOK_TM (10, ‘Козаки’, ‘Толстой Л.’, 5000)

9.7 ЗМІНА ТА ВИДАЛЕННЯ ТИПІВДля зміни об’єктного типу використовується оператор ALTER TYPE, який можна використовуватидля перекомпіляції опису або тіла об’єктного типу, або для додавання в тип нових методів.

Команда ALTER TYPE має наступний синтаксис:

ALTER TYPE ім’я_типу COMPILE [SPECIFICATION │ BODY]; де ім’я_типу – ім’я змінюваного типу. За допомогою цієї команди можна перекомпілювати

специфікацію або тіло типу, які в скомпільованому вигляді зберігаються в словнику даних. Якщоне зазначається ні SPECIFICATION, ні BODY, то перекомпілювати будуть як опис, так і т іло типу.Наприклад, наступна команда викликає перекомпіляцію тіла типу BOOK_T:

ALTER TYPE BOOK_T COMPILE BODY;

Перекомпіляція об’єкта може знадобитися у разі, коли об’єкт в результаті зміни пов’язаних з

даним об’єктом інших об’єктів.Інша форма команди ALTER TYPE використовується для додавання до типу нових методів.

Вона має наступний синтаксис:

ALTER TYPE ім’я_типу REPLACE AS OBLECT(спеціфікація_об’єктного_типу);

де ім’я_типу – це ім’я об’єктного типу, а специфікація_об’єктного_типу – повний опис типу,

визначений командою CREATE TYPE. Новий опис має у всьому, крім додаткових методів, збігатисяз вихідним. Повинні бути вказані початкові атрибути та типи. Якщо тіло типу вже існує, воностає недостовірним, оскільки в ньому не описані нові методи.

Використання команди ALTER TYPE ... REPLACE AS OBLECT ілюструється на наступномуприкладі. Запитаємо статус об’єкта BOOK_T.

SELECT OBJECT_NAME, OBJECT_TYPE, STATUSFROM USER_OBJECTSWHERE OBJECT_NAME = ‘BOOK_T’;

У результаті отримаємо повідомлення про достовірність заголовка і т іла об’єкта BOOK_T.

OBLECT_NAME OBJECT_TYPE STATUS– – – – –BOOK_T TYPE VALIDBOOK_T TYPE BODY VALID

Змінимо тип, додавши до нього новий метод. При цьому тіло типу стає недостовірним.

ALTER TYPE BOOK_T REPLACE AS OBJECT(ID NUMBER (2), – код книгиTITLE VARCHAR2 (15), – назва книгиAUTHOR VARCHAR2 (15), – прізвище автораPRICE NUMBER (7), – ціна книги– – Повертає Прізвище автора і назву книги.MEMBER FUNCTION FORMATTED_NAMERETURN VARCHAR2,– – Оновлює поле PRICE значенням, зазначеним у поле NEW_PRICE.MEMBER PROCEDURE CHANGE_PRICE(NEW_PRICE IN NUMBER),– – Повертає Код книги

Основи роботи в СУБД Oracle. 100

Page 101: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

MEMBER FUNCTION BOOK_ID RETURN NUMBER ); Запитаємо ще раз статус об’єкта BOOK_T.

SELECT OBJECT_NAME, OBJECT_TYPE, STATUSFROM USER_OBJECTSWHERE OBJECT_NAME = ‘BOOK_T’;У результаті отримаємо повідомлення про недостовірність тіла об’єкта BOOK_T.OBLECT_NAME OBJECT_TYPE STATUS– – – – –BOOK_T TYPE VALIDBOOK_T TYPE BODY INVALID

Створимо заново тіло типу BOOK_T з доданим новим методом.

CREATE OR REPLACE TYPE BODY BOOK_T ASMEMBER FUNCTION FORMATTED_NAMERETURN VARCHAR2 ISBEGIN

RETURN SELF.AUTHOR ║ SELF.TITLE;END FORMATTED_NAME;MEMBER PROCEDURE CHANGE_PRICE(NEW_PRICE IN NUMBER) ISBEGIN

PRICE: = NEW_PRICE;END CHANGE_PRICE;MEMBER FUNCTION BOOK_ID RETURN NUMBER ISBEGIN

RETURN ID;END BOOK_ID;END;

Запитаємо статус об’єкта BOOK_T.

SELECT OBJECT_NAME, OBJECT_TYPE, STATUSFROM USER_OBJECTSWHERE OBJECT_NAME = ‘BOOK_T’;

У результаті отримаємо повідомлення про достовірність тіла об’єкта

BOOK_T.OBLECT_NAME OBJECT_TYPE STATUS– – – – –BOOK_T TYPE VALIDBOOK_T TYPE BODY VALID

Команда DROP TYPE використовується для видалення об’єктного типу і має наступний

синтаксис:

DROP TYPE ім’я_типу [FORCE]; При цьому якщо використовується опція FORCE, то об’єктний тип видаляється примусово,

незважаючи на наявні зв’язки, і роблячи при цьому недійсними усі залежні від нього об’єкти.Якщо даний параметр відсутній, то об’єктний тип буде видалений тільки в тому випадку, якщона нього немає посилань, тобто за відсутності у схемі інших об’єктів, залежних від даногооб’єктного типу.

Команда DROP TYPE BODY ім’я_типу видаляє тільки тіло об’єктного типу, не чіпаючиспецифікацію типу та всі залежні від нього об’єкти.

Основи роботи в СУБД Oracle.

Основи роботи в СУБД Oracle. 101

Page 102: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

10.1. Характеристика СУБД Oracle10.2 Об’єкти бази даних Oracle10.3 Словник даних Oracle

10.1. ХАРАКТЕРИСТИКА СУБД ORACLEСУБД Oracle – це сучасна система управління реляційними базами даних, що підтримує роботу врізних операційних середовищах. Система Oracle реалізує найсучасніші технології і підтримуєбагато можливостей, що дозволяє характеризувати її як досить потужну систему. АрхітектураСУБД Oracle включає дві важливих частини – ядро, яке є програмним забезпеченням, і словникданих, який складається з структур даних системного рівня, які використовуються ядром,керуючим базою даних. СУБД можна розглядати як операційну систему, розроблену спеціальнодля управління доступом до даних; її основні функції – зберігання, вибірка та забезпеченнябезпеки даних. Подібно операційній системі СУБД Oracle управляє доступом одночаснопрацюючих користувачів БД до деякого набору ресурсів. Підсистеми СУБД дуже схожі звідповідними підсистемами операційної системи і сильно інтегровані з сервісними функціямибазової ОС доступу на машинному рівні до таких ресурсів, як пам’ять, центральний процесор,пристрої введення-виведення і файлові структури. Підсистеми СУБД підтримують власнийсписок авторизованих користувачів і їх привілеїв; управляють кешем пам’яті і сторінковимобміном; блокуванням поділюваних ресурсів; використанням табличного простору; приймають іпланують виконання запитів користувача. До основних функцій ядра СУБД Oracle, керуючого БД,відносяться:

введення-виведення;управління пам’яттю;управління блокуваннями;управління транзакціями;контроль розподілених операцій;ведення журналів транзакцій і відновлення бази даних;управління зберіганням даних;управління процесом;підтримка мови управління даними;захист інформації.

СУБД Oracle є складним програмним продуктом. Тому для забезпечення роботи користувачів збазою даних Oracle потрібні фахівці, відповідальні за роботу всієї системи – адміністратори базиданих. Наприклад, у функції адміністратора бази даних входить:

1. Створення екземпляра Oracle і його запуск;2. Створення початкового варіанта БД і планування її подальшого розширення;3. Реєстрація користувачів в системі, призначення їм привілеїв, ролей і профілів;4. Відстеження роботи БД та вжиття заходів щодо оптимізації її функціонування;5. Створення резервних копій БД і відновлення БД після збоїв.

10.2 ОБ’ЄКТИ БАЗИ ДАНИХ ORACLEУ базі даних Oracle містяться різні типи об’єктів. Їх можна розділити на дві категорії: об’єктисхеми та об’єкти, які не належать схемs.

Схема – це набір об’єктів різної логічної структури даних. Кожна схема належитькористувачеві БД і має однакове з ним ім’я. Схема може містити наступні об’єкти:

1. Таблиці (tables);2. Подання, або види (views);3. Синоніми (synonyms);4. Послідовності (sequence);5. Індекси (indexes);6. Кластери (clusters);

Основи роботи в СУБД Oracle. 102

Page 103: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

7. Зв’язки з БД (database links);8. Знімки (snapshots);9. Тригери (triggers);

10. Збережені процедури і функції (stored procedures and functions);11. Пакети (packages).

До об’єктів, що не належать схемі, але зберігаються в БД, відносяться профілі, ролі,користувачі, табличні простори, сегменти відкату, тимчасові сегменти.

Дамо короткий опис об’єктів, що належать схемі.Таблиці є сегментами БД, в яких зберігаються власне дані. Кожна таблиця складається з

рядків (записів). Кожен стовпець таблиці має ім’я і містить дані одного типу. Інформація протаблиці зберігається в поданні DBA_TABLES словника даних.

Подання – віртуальні таблиці, які будуються на основі інших таблиць і подань, якіназиваються в цьому випадку базовими таблицями даного подання, в результаті виконаннязапиту. Так як подання не містить ніяких даних, то для нього не виділяється фізична пам’ять надиску. При зверненні до подання цей запит виконується заново. Інформація про поданнязберігається в поданні DBA_VIEWS словника даних.

Синоніми – це псевдоніми або альтернативні імена об’єктів БД, якими може бути таблиця,подання, послідовність, процедура, функція, пакет або знімок. При створенні синоніма задаєтьсяйого ім’я та ім’я об’єкта, на який вказує синонім. Коли сервер Oracle зустріне синонім у запиті, вінавтоматично замінить його назвою об’єкта посилання. Синоніми часто використовуються длязручності роботи з даними, а також можуть використовуватися в цілях забезпечення безпеки.Інформація про синоніми зберігається в поданні DBA_SYNONYMS словника даних.

Послідовності – це об’єкти БД, які використовуються для формування унікальних числовихвеличин для стовпця таблиці, який гратиме роль первинного ключа. Інформацію про всіпослідовності зберігається в поданні DBA_SEQUENCES словника даних.

Індекси – це сегменти БД, створені для прискорення пошуку даних в певній таблиці. Індексиможуть бути пов’язані з кожною таблицею або кластером. У індексах зберігаються значення зодного або декількох стовпців таблиці і значення ROWID - фізичної адреси рядка, для кожного ззбережених значень стовпця (стовпців). Для однієї таблиці даних може бути створено кількаіндексів, які відрізняються один від одного набором або впорядкованістю стовпців цієї таблиці.Існує кілька типів індексів: двійковий деревовидний індекс, кластерний індекс, масковийдвійковий індекс, який будується для невеликого діапазону значень.

Кластери таблиць – це об’єкти БД, які фізично групують спільно використовувані таблиці вмежах одного блоку даних. Кластеризація таблиць дає значний ефект в тому випадку, якщо всистемі доводиться оперувати запитами, які вимагають спільної обробки даних з декількохтаблиць. У кластері таблиці зберігаються ключ кластера (стовпець, використовуваний дляоб’єднання таблиць) і значення зі стовпців кластеризованих таблиць. Оскільки групові таблицізберігаються в одному блоці БД, час на виконання операцій введення-виведення помітноскорочується.

Зв’язки з БД – це збережені визначення підключень до віддалених БД. Вонивикористовуються при запитах до віддалених таблицями в розподілених БД.

Знімки є копією таблиць даних, отримані з віддалених БД в розподілених БД.Тригери – збережені процедури, написані на мові PL / SQL, які активізуються і виконуються в

таких випадках:

при модифікації деякої таблиці БД;при створенні, зміну або видалення об’єктів схеми БД.

Тригери є зручним засобом для забезпечення цілісності та безпеки даних. Інформацію протригери можна отримати через подання DBA_TRIGGERS словника даних.

Збережені процедури і функції є програмами на мові PL / SQL, створювані користувачем ізберігаються в БД. Можуть запускатися як за допомогою інтерактивного редактора, так і задопомогою інших збережених процедур і функцій. Інформація про збережених процедурах іфункціях міститься в поданні DBA_OBJECTS і DBA_SOURCE словника даних. Там же зберігається іїх вихідний код.

Пакети є сукупністю процедур, змінних і функцій, об’єднаних для виконання деякої задачі.Пакети мають заголовок і т іло. У заголовку описуються курсори, виняткові ситуації, заголовкифункцій, процедур, змінні. У тілі безпосередньо реалізуються функції і процедури. Інформація пропакети зберігається в поданні DBA_OBJECTS і DBA_SOURCE словника даних.

10.3 СЛОВНИК ДАНИХ ORACLE

Основи роботи в СУБД Oracle. 103

Page 104: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Словник даних (Data Dictionary) є сукупністю таблиць і подань, що містять всю довідковуінформацію (він зберігає метадані – дані про дані) про всі об’єкти БД: таблиці, індекси, подання,тригери, пакети, процедури і функції. Іноді його називають каталогом системи. У словникуданих містяться визначення об’єктів БД, розміри виділеної пам’яті для кожного об’єкта схеми,описи фактичного фізичного розташування об’єктів в пам’яті, список користувачів іззазначенням привілеїв і ролей, обмеження цілісності, значення стовпців за замовчуванням і т. д.Всі запити до БД оброблюються з використанням словника даних. Він створюється системоюавтоматично одночасно з БД, зберігається в табличному просторі SYSTEM і ведеться ядромOracle. Словник даних доступний тільки в режимі читання, причому для різних категорійкористувачів доступні різні рівні. Усі вхідні в словник таблиці та подання поділяються на чотиривиди:

1. Внутрішні таблиці СУБД (Х $ -таблиця);2. Таблиці словника даних;3. Подання поточної активності (V $ -подання);4. Подання словника даних.

Розглянемо докладніше їх призначення.Внутрішні (базові) таблиці СУБД – це таблиці, які використовуються тільки самою системою

Oracle. Вони є ключовим компонентом всієї інформаційної структури БД. Саме до нихзвертається СУБД за всією внутрішньою інформацією про поточний стан і процеси, щовідбуваються в системі. Таблиці зберігають інформацію про БД в закодованому вигляді, щоускладнює їх використання.

Таблиці словника даних містять інформацію про всі типи об’єктів, що зберігаються в БД.Таблиці словника даних мають в кінці імені знак долара. Більшу частину інформації з них можназнайти в поданнях словника даних.

Подання поточної активності формуються і динамічно змінюються в процесі роботи СУБДOracle. У них міститься величезна кількість різноманітної інформації про процеси, щовідбуваються в БД, її конфігурації і параметри налаштування більшості функцій. Інформаціяпредставлена в легкодоступній формі і може бути використана адміністратором БД длядіагностики та налаштування системи.

Подання словника даних призначені для перегляду інформації зі словника данихкористувачами. Вони формуються на базі Х $ -таблиці і таблиць словника даних. Користувачіотримують доступ до подань словника даних за допомогою операторів мови SQL. Більшістьподань словника даних мають префікси USER_, ALL_, DBA_.

Подання з префіксом USER_ містять інформацію про всі об’єкти, що належать користувачу.Подання з префіксом ALL_ містять інформацію про всі об’єкти БД, до яких може отримати

доступ користувач при виконанні запиту.Подання з префіксом DBA_ містять інформацію про всі об’єкти в БД і, отже, ці подання

доступні т ільки користувачеві, який має доступ до всіх таблиць БД, зокрема ними єадміністратори БД.

Термін база даних Oracle використовується для позначення фізичної та логічної структурданих спільно зі всією службовою інформацією. Щоб розділити опис логічної організаціїданих від способів їх зберігання та доступу до них, в Oracle використовується дворівневаорганізація БД. Об’єкти верхнього (логічного) рівня називаються логічними структурами, аоб’єкти нижнього (фізичного) рівня – фізичними структурами БД.

11.1 Фізична організація БД Oracle11.2 Логічна структура БД Oracle11.3 Архітектура екземпляра бази даних Oracle

11.3.1. Процеси екземпляра.11.3.2. Структури пам’яті екземпляра.

11.4 Формування бази даних і екземпляра Oracle

ТЕРМІН БАЗА ДАНИХ ORACLE ВИКОРИСТОВУЄТЬСЯ ДЛЯ ПОЗНАЧЕННЯ ФІЗИЧНОЇТА ЛОГІЧНОЇ СТРУКТУР ДАНИХ СПІЛЬНО ЗІ ВСІЄЮ СЛУЖБОВОЮ ІНФОРМАЦІЄЮ.ЩОБ РОЗДІЛИТИ ОПИС ЛОГІЧНОЇ ОРГАНІЗАЦІЇ ДАНИХ ВІД СПОСОБІВ ЇХЗБЕРІГАННЯ ТА ДОСТУПУ ДО НИХ, В ORACLE ВИКОРИСТОВУЄТЬСЯ ДВОРІВНЕВАОРГАНІЗАЦІЯ БД. ОБ’ЄКТИ ВЕРХНЬОГО (ЛОГІЧНОГО) РІВНЯ НАЗИВАЮТЬСЯЛОГІЧНИМИ СТРУКТУРАМИ, А ОБ’ЄКТИ НИЖНЬОГО (ФІЗИЧНОГО) РІВНЯ –ФІЗИЧНИМИ СТРУКТУРАМИ БД.

Основи роботи в СУБД Oracle. 104

Page 105: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

11.1 Фізична організація БД OracleФізично БД Oracle організована як сукупність файлів, створюваних звичайними засобамиопераційної системи. Таким чином, основою фізичного рівня є файл.

Всі компоненти фізичного рівня БД можна розділити на дві великі групи – системні об’єкти, щовикористовуються всередині системи і необхідні СУБД для виконання її функцій, і об’єктикористувача. Системні файли створюються і настроюються адміністратором БД і не можутьбути доступні користувачеві в явному вигляді. У число системних об’єктів входять:

1. файл параметрів ініціалізації;2. керуючий файл;3. файли журналу реєстрації транзакцій;4. файли трасування.

До користувальницьких об’єктів фізичного рівня БД відносяться файли даних.Файл параметрів ініціалізації Init.ora містить список параметрів та ключів налаштування,

кожен з яких пов’язаний з певною функцією системи або компонентом БД і є звичайнимтекстовим файлом. Цей файл зчитується перед запуском БД, формуванням екземпляра Oracle ізчитуванням керуючих файлів. Значення параметрів, які задані в Init.ora, визначаютьхарактеристики формованого екземпляра Oracle і створюваної БД. Зокрема, тут заданіпараметри розподілу пам’яті для розподіляємого пулу, кеш-буфера даних, буфера журналутранзакцій, характеристики автоматично запускаються фонових процесів, зчитувальнихкеруючих файлів, сегментів відкоту і т. Д.

Керуючий файл містить інформацію про файли даних і файлах журналів реєстрації транзакцій,про набір символів, який використовується для зберігання даних, про статус і дати оновленнявсіх файлів даних, а також іншу аналогічну інформацію. Більшість параметрів, що зберігаються вкеруючому файлі, формуються при створенні БД. При відсутності коректного керуючого файлуБД не відкривається, і її інформація стає недоступною. Тому всередині СУБД передбаченийпідтримуваний сервером Oracle механізм тиражування керуючого файлу. Рекомендується матидо трьох копій керуючого файлу.

Файли журналу реєстрації транзакцій діляться на оперативні та архівні. Оперативні файлижурналу реєстрації транзакцій використовуються для запису вмісту буфера журналутранзакцій. Ці журнали зберігають відомості про всі транзакції, які так чи інакше пов’язані зізмінами вмісту БД і при необхідності можуть бути використані для відновлення БД. Мінімальнакількість оперативних файлів журналу реєстрації транзакцій дорівнює двом. Запис у нихвиконується по черзі. Файл журналу реєстрації транзакцій, в який проводиться запис,називається активним. Після заповнення одного файлу журналу реєстрації транзакцій системаперемикається на наступний файл, а інформація першого файлу починає перезаписуватися вархівні файли журналу реєстрації транзакцій. Архівні файли журналу реєстрації транзакційспільно зі створюваною регулярно копією БД дозволяють повністю відновити зміст бази, якщовідбудеться викривлення або втрата інформації БД. З метою забезпечення безперебійноїроботи системи створюються групи (як мінімум дві) оперативних файлів журналу реєстраціїтранзакцій, де кожна група складається з безлічі однакових елементів. Як тільки група стаєактивною, черговий запис у журналі виконується паралельно в усі елементи групи.

У файлах трасування реєструються системні повідомлення, помилки, та інформації про всіголовні події системи. Саме в цих файлах слід шукати інформацію при аналізі причин виникненнятієї чи іншої нестандартної ситуації. Тут фіксуються всі критичні збої системи, а такожповідомлення про запуск або припинення роботи з БД, перемиканні файлів журналу транзакційта інших подіях. Користувальницькі і фонові процеси можуть сформувати свої власні файлитрасування.

Файли даних призначені для зберігання як службової інформації, так і користувача інформації.До службової інформації відносяться словник даних та інші службові таблиці подання, докористувальницької – об’єкти, створені користувачем. Файл даних є звичайним двійковимфайлом операційної системи. Файли даних формуються при створенні або модифікації табличнихпросторів, що є об’єктами логічної структури БД Oracle. Під час першого створення файли данихрозбиваються сервером на блоки Oracle.

Інформація про всі файли даних, що становлять фізичний простір БД, зберігається в поданнісловника даних DBA_DATA_FILES.

Блоки Oracle є елементами нижчого в системі рівня ієрархії зберігання даних, представляючисобою найменш адресуєми сервером Oracle одиниці зберігання (найменші одиниці зовнішньоїпам’яті). Обсяги об’єктів в БД і розміри блоків в кеш-буфері даних встановлюються в блокахOracle. Блоки Oracle нумеруються послідовно, починаючи з одиниці, для кожного файлу даних. Условнику даних Oracle веде список вільних блоків для кожного файлу даних. Блоки Oracleформуються з блоків операційної системи. Розмір блоку Oracle повинен бути кратний розміру

Основи роботи в СУБД Oracle. 105

Page 106: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

блоку даних, який використовується операційною системою для введення і виведення даних надиск. Розмір блоку Oracle встановлюється при створенні бази даних і надалі не може бутизмінений.

У кожному блоці Oracle передбачено місце для заголовка, майбутніх оновлень даних блоку іреально існуючих рядків даних. Заголовок містить інформацію про те, якого сегменту даних(якій таблиці, індексу і т. д.) належать рядки, що зберігаються в блоці, при максимальному числітранзакцій, які можуть бути одночасно адресовані до даних блоку. Рядки даних, поміщені вблок, нумеруються. Деяка частина блоку залишається вільною. Розмір вільної частини блокузадається параметром PCTFREE при створенні таблиці і вказується у відсотках. Цей вільнийпростір резервується для можливого збільшення обсягу рядків даних, що зберігаються в блоці,в результаті модифікації.

Для більш гнучкої політики використання простору блоку використовується параметрPCTUSED, також задається при створенні таблиці. Цей параметр вказує, яка частина обсягублоку повинна звільнитися, перш ніж блок буде знову включений в список доступних длявведення нових рядків. Звільнення простору блоку можливе в результаті видалення рядків іскорочення обсягу зберігається в них інформації після оновлення даних.

Інформаційна частина блоку містить рядки даних. При переміщенні чергового рядка в блокдля нього формується внутрішня інформаційна структура Oracle – ROWID, що представляє собоюфізичну адресу розміщення рядка. Ця адреса залишається незміною до видалення рядка абореорганізації сегмента і має формат: BBBBBBBB.RRRR.FFFF, де: BBBBBBBB – шістнадцятирічнийномер блоку у файлі даних, в якому знаходиться рядок; RRRR – шістнадцятирічний номер рядка вблоці; FFFF – шістнадцятирічний номер файлу, що містить блок.

11.2 Логічна структура БД OracleЛогічна структура БД Oracle складається з користувальницьких компонентів. Форма іпризначення об’єктів логічної структури мають сенс тільки в контексті сервера Oracle. До нихвідносяться табличні простори (tablespace), сегменти (segments) і екстенти (extents).

Табличний простір – це логічний об’єкт, який використовується для групування даних з метоюорганізації більш чіткої структури БД. В один табличний простір користувач БД може поміститилогічні об’єкти, близько пов’язані між собою. Наприклад, всі таблиці, використовувані одним ітим же додатком, можуть бути об’єднані в один табличний простір. Фізично табличний простірреалізовано сукупністю одного або декількох файлів даних. Кожен файл даних розміщений водному табличному просторі і зберігає поточні дані цього простору. Файли даних табличногопростору створюються одночасно зі створенням табличного простору. При створенні БД зазамовчуванням створюється табличний простір SYSTEM, що містить файли словника даних таінших службових таблиць і подань. Імена табличних просторів, за винятком SYSTEM, можутьвибиратися довільно. Табличні простори можуть бути додані, видалені з БД. Крім цього, новітабличні простори можуть переводитися в автономний стан (стан блокування) або воперативний стан (доступні для роботи). Табличний простір SYSTEM не може бути ні видалено, ніпереведено в автономний стан. При формуванні об’єкта БД потрібно вказувати табличнийпростір, якому він буде належати. Після цього дані (які, власне, і утворюють об’єкт) будутьзберігатися у файлах даних, що належать зазначеному табличному простору. Тому рядки однієїтаблиці, наприклад, можуть зберігатися в декількох файлах даних. Інформацію про всі табличніпростори БД і їх статус зберігається в поданні словника БД DBA_TABLESPACES.

Сегмент – це загальна назва для об’єктів інформаційної структури, які зберігаються в БД,тобто займають місце в файлах БД. Сегмент використовує певне число блоків Oracle, якізнаходяться в одному табличному просторі, але можуть належати різним файлам. Об’єднаннясегментів утворює табличний простір. Існує чотири типи таких об’єктів:

сегменти даних (data segments);сегменти індексів (index segments);сегменти відкату (rollback segments);тимчасові сегменти (temporary segments).

Сегменти відкату і тимчасові сегменти створюються, як правило, системою. Сегменти даних ісегменти індексів – це об’єкти користувача. Слід зазначити, що багато об’єктів схеми маютьсегменти, які розташовуються в табличних просторах. Однак у БД є ряд об’єктів користувача,які можна кваліфікувати як сегменти. Це подання, послідовності, синоніми, зв’язки, тригери,збережені функції та процедури і пакети. Інформація про них зберігається в словнику даних, а вБД вони місця не займають.

При створенні об’єкта йому виділяється деякий простір у вказаному табличному просторі –сегмент. Визначаючи ім’я табличного простору, слід врахувати обсяг наявного вільного місця втабличному просторі і можливість автоматичного розширення файлів даних, що становлять

Основи роботи в СУБД Oracle. 106

Page 107: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

табличному просторі і можливість автоматичного розширення файлів даних, що становлятьтабличний простір. При збільшенні об’єкта розмір сегмента може збільшитися на заданий розміррозширення сегмента, який називається екстентом.

Екстенти – це об’єкти інформаційної структури зберігання даних. Кожен сегмент БДскладається з одного або декількох екстентів. Зовнішня пам’ять для об’єкта БД виділяєтьсяпорціями з певного числа блоків. У файлах БД ці блоки повинні бути суміжними. Група суміжнихблоків називається екстентом. Слід зазначити, що пам’ять для об’єктів виділяєтьсяекстентами, які можуть знаходитися на різних дисках. Після виділення екстента об’єкту ціблоки не можуть бути використані іншими об’єктами БД. При створенні об’єкта система Oracleавтоматично розподіляє у відповідний сегмент початковий екстент для даного об’єкта. Якщопочатковий сегмент повністю заповнюється даними під час роботи з об’єктом, то Oracleавтоматично виділяє додаткові екстенти для цього об’єкта. При видаленні інформації екстентизвільняються, але залишаються пов’язаними з об’єктом (за винятком екстентів сегментавідкату і тимчасового сегмента) до тих пір, поки не буде виконана операція видалення об’єкта.Наприклад, якщо видалити всі рядки таблиці, то розподілені їй блоки все одно залишаютьсязакріпленими за цією таблицею. Таблицю потрібно видалити (оператор DROP) або усікти(оператор TRUNCATE), щоб звільнити зовнішню пам’ять, виділену таблиці. Видалення об’єктівможе призвести до фрагментації. В системі Oracle усуненням фрагментації займаєтьсясистемний монітор SMON.

Коротко опишемо призначення перерахованих типів сегментів.Сегменти даних призначені для зберігання звичайних таблиць і кластеризованих таблиць,

отже, містять рядки таблиць даних. Екстенти для таблиці можуть бути виділені з різнихфайлів, але ці файли повинні обов’язково належати одному табличному простору. Одній таблицівідповідає один сегмент.

Сегменти індексів служать для зберігання індексів - це спеціальні таблиці, які містятьінформацію з ключового стовпця таблиці і ідентифікатор номера рядка – ROWID.

Сегменти відкату – це об’єкти інформаційної структури БД. Вони будуються системою івикористовуються при виконанні транзакцій. При модифікації даних транзакцією їх попереднійстан копіюється в сегмент відкоту, а зміни виконуються в блоках, які зберігаються в кеш-буферіданих. Якщо інший запит користувача зажадає ці дані, то вони витягуються з сегмента відкату.Коли ж результати модифікації вважаються остаточно прийнятими, відповідний сегментвідкоту позначається як недійсний. Якщо транзакція завершується неуспішно, то інформація зсегменту відкату поміщається назад в БД, і початковий стан БД відновлюється. Сегментувідкату необхідно як мінімум два екстента. Перший сегмент відкоту створюється автоматичнопри створенні БД, має ім’я SYSTEM і розміщується в табличному просторі SYSTEM. Сегментивідкату також використовуються для відновлення БД після збоїв устаткування або скасуваннядій операторів модифікації даних.

Тимчасові сегменти створюються системою і використовують простір у файлах БД, щобстворити тимчасову робочу область для проміжних стадій обробки запиту, записаного на мовіSQL, і для великих операцій сортування. Наступні операції можуть призводити до створеннятимчасових сегментів:

створення індексу;використання фраз ORDER BY, DISTINCT або GROUP BY в операторі SELECT;використання операторів роботи з множинами UNION, INTERSECT, MINUS;створення з’єднань таблиць;використання деяких типів підзапитів.

З метою більш ефективної роботи рекомендується сегменти даних розміщувати в одномутабличному просторі, сегменти індексів – в іншому, тимчасові сегменти – у третьому і т.д.

11.3 Архітектура екземпляра бази даних OracleЕкземпляр бази даних (Database Instance) Oracle являє собою сукупність складного комплексувзаємодіючих процесів і певних структур оперативної пам’яті. Кожна БД Oracle має пов’язаний знею екземпляр, причому до тих пір, поки не буде використовуватися опція Oracle Parallel Server,для БД формується тільки один екземпляр. Організація екземпляра дозволяє СУБДобслуговувати безліч типів транзакцій, ініційованих одночасно великою кількістю користувачів, ів той же час забезпечувати високу продуктивність, цілісність і безпеку даних.

11.3.1. Процеси екземпляра.Всі процеси, що працюють з БД Oracle, можна розділити на системні і користувальницькі.Системні процеси Oracle діляться на дві категорії: серверні процеси і фонові процеси.

Основи роботи в СУБД Oracle. 107

Page 108: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

Користувальницькі процеси запускаються користувачами БД, які для здійснення доступу до БДвикористовують прикладні засоби Oracle, такі як, наприклад, інтерактивну середу SQL * Plus,генератор звітів Oracle Reports, генератор форм Oracle Forms, або різні прикладні програми.Кожен процес користувача підключається до процесу сервера, який або може бути жорсткопов’язаний з одним процесом користувача, або розділятися між багатьма процесамикористувача. Серверний процес аналізує і виконує передані йому оператори SQL і повертаєрезультати процесу користувача. Крім того, серверний процес зчитує блоки даних з файлівданих і розміщує їх в кеш-буфері даних. Фонові процеси Oracle працюють у фоновому режимі.Вони виконують різні функції, необхідні для підтримки роботи БД, а також здійснюютьасинхронний ввід-вивід даних. Фонові процеси діляться на обов’язкові та необов’язкові.

Обов’язкові фонові процеси присутні в будь-якій конфігурації екземпляра Oracle і до нихвідносяться чотири процеси.

1. Процес DBWR (Database Writer), який здійснює запис модифікованих блоків даних з кеш-буфера даних назад в БД.

2. Процес LGWR (Log Writer), який здійснює запис інформації з буфера журналу транзакцій,розташованого в оперативній пам’яті, в оперативні файли журналу транзакцій.

3. Процес SMON (System Monitor) – системний монітор, який здійснює моніторинг екземпляраБД.

4. Процес PMON (Process Monitor) – монітор процесів, контролюючий процеси екземпляра.

Опишемо необов’язкові фонові процеси.

1. CKPT (Checkpoint Process) – процес контрольної точки. Він обробляє подію «контрольнаточка», що виникає в системі за певних умов. Цей процес може бути присутнім в будь-якоїконфігурації екземпляра Oracle.

2. ARCH (Archiver) – процес запису журналу архіву. Він забезпечує копіювання оперативнихфайлів журналів транзакції в архівні файли при їх заповненні. Цей процес може бутиприсутнім в будь-якої конфігурації екземпляра Oracle.

3. Dnnn (Dispatcher), n = 0, 1, ..., 9, – процеси-диспетчери. При обслуговуванні процесівкористувача розділяються серверними процесами, одним або декількома, вони виконуютьсинхронізацію взаємодії серверних і користувальницьких процесів.

4. RECO (Recoverer) – процес відновлення. Він відповідає за відновлення незавершенихтранзакцій в розподіленій БД в конфігурації екземпляра Oracle Distributed.

5. SNPn (Snapshots Process), n = 1, 2, ..., 9, A, ..., Z, – ці процеси використовуються дляотримання знімків віддалених БД у разі розподіленої БД в конфігурація екземпляра OracleDistributed.

6. LCKn (Parallel Server Lock Process), n = 0, 1, ..., 9, – процеси блокування. Ці процеси вконфігурації екземпляра Oracle Parallel Server відповідають за координацію блокувань БД,встановлюваних різними екземплярами Oracle.

7. Pnnn, n = 0, 1, ..., 9, – процеси паралельних запитів. Ці процеси використовуються вконфігурації екземпляра Oracle Parallel Query для обслуговування паралельно виконуванихчастин запитів.

11.3.2. Структури пам’яті екземпляра.Кожному процесу користувача виділяється область пам’яті, яка називається глобальноїобластю процесу (process global area) і скорочено позначається PGA. Вміст PGA залежить відрежиму підключення користувальницького процесу до процесу сервера. Якщо процескористувача взаємодіє з виділеним серверним процесом, то в PGA розміщується інформація пропоточний сеанс роботи користувача, стек і інформація про стан курсору. Інформація пропоточний сеанс, у свою чергу, включає дані, необхідні для системи забезпечення безпеки, і даніпро використовувані ресурси. У стеці містяться локальні змінні, а в області стану курсора –поточна інформація про стан курсору, рядки, які повертаються, і код курсору, якийповертається. Якщо ж процес користувача пов’язаний з розділяємим серверним процесом, тоінформація про поточний сеанс і поточний стан курсору зберігається в глобальній системнійобласті.

Крім того, для всіх процесів виділяється загальна область пам’яті, яка називаєтьсяглобальною областю системи (system global area – SGA). У SGA зберігаються структури пам’яті,необхідні для маніпулювання даними, аналізу речень SQL і кешуванням транзакцій. Ця областьрозділяєма, тобто до неї одночасно має доступ безліч процесів, які можуть зчитувати імодифікувати містяться в ній дані.

Глобальна область системи складається з таких компонентів:

Основи роботи в СУБД Oracle. 108

Page 109: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

пул (shared pool);кеш-буфер бази даних (database buffer cache);буфер журналу транзакцій (redo log buffer).

Коротко опишемо призначення кожного з цих розділів глобальної області системи.Пул кешує інформацію, яка використовується при розборі та виконанні операторів SQL. Пул

містить два основних розділи: кеш бібліотек і кеш словника даних.Кеш бібліотек зберігає текст SQL-виразів, формати лексичного аналізатора і план виконання

речень SQL. Крім того, тут же містяться заголовки пакетів PL / SQL і процедур, які можутьспільно використовуватися процесами користувача. Сервер Oracle використовує кеш бібліотекдля підвищення швидкості виконання операторів SQL. Коли передається черговий SQL-вираз,сервер в першу чергу переглядає кеш в пошуках такого ж виразу, переданого раніше. Якщо вінзнайдений, то використовується відповідне йому дерево лексичного аналізу і план виконаннязапиту, що позбавляє від необхідності формувати їх повторно. Кеш бібліотек містить іколективні області SQL, і локальні області SQL. Розділяєма область SQL включає дереволексичного аналізу і план виконання SQL-виразу, а локальна область – інформацію, яка залежитьвід поточного сеансу роботи. Це можуть бути приєднані змінні, параметри оточення, стеки ібуфери, необхідні при виконанні. Локальна область формується для кожної ініціюємої транзакціїі звільняється після того, як закривається відповідний курсор. Використовуючи ці структурипам’яті, сервер Oracle може повторно використовувати інформацію, загальну для всіх виразівSQL, а специфічна до даного сеансу може бути обрана з локальної області. Локальна областьSQL ділиться у свою чергу на перехідну (persistent) область і область часу виконання (runtime).При цьому перехідна область містить інформацію, яка зберігає своє значення і може бутивикористана декількома виразами SQL, а область часу виконання – тільки інформацію длявиразу, виконуваного в поточний момент.

Кеш словника зберігає рядки словника даних, які були використані для лексичного аналізуSQL-виразів. У цій області знаходяться дані, що стосуються сегментування, привілеїв доступу ірозмірів вільної пам’яті. При запуску екземпляра він завантажується деяким початковимнабором елементів і в процесі роботи поповнюється необхідними даними зі словника.

Кеш-буфер даних складається з буферів БД і зберігає інформацію, що завантажується з БДсерверними процесами. Всі модифікації над даними реалізуються в кеш-буфері. Є список, щовідслідковує частоту звернень до зберігаємих в кеш-буфері блоків даних. Сервер переноситьдані на диск відповідно до порядку їх розміщення в списку LRU (Least Recently Used, дослівно –«найбільш давно використовувалися»). Цей список відстежує звернення до блоків даних івраховує частоту звернень. Коли виконується чергове звернення до блоку даних, щозберігається в кеш-буфері, він поміщається в той кінець списку, який називається MRU (MostRecently Used – «тільки що використані»). Якщо серверу потрібне місце в кеш-буфері длязавантаження нового блоку з диска, він звертається до списку LRU і вирішує, який з блоківперенести на диск, щоб звільнити місце для нового блоку. Блоки, найбільш віддалені у спискувід MRU, найімовірніші кандидати на видалення з кеш-буфера. Таким чином, найдовшезалишаються в кеш-буфері т і блоки, до яких звернення виконується найчастіше. Модифікованіблоки називаються «брудними» (dirty) і поміщаються у відповідний dirty-список. У цьому спискувідстежуються всі модифікації блоків даних, виконані за час їхнього перебування в кеш буферіта не зафіксовані на диску. Коли Oracle отримує запит на зміну даних, відповідні змінивиконуються в області кеш-буфера, а відомості про зміни в блоках заносяться в dirty-список;одночасно дані про виконані операції вносяться в журнал транзакцій. Надалі при зверненні доблоків даних, що потрапили в dirty-список, будуть зчитуватися вже модифіковані значення, хочасамі дані можуть до цього часу ще не бути записані на диск. Сервер використовує відкладенубагатоблокову процедуру запису на диск з метою підвищення продуктивності. Відкладенапроцедура означає, що оновлення даних, виконане Oracle, не фіксується негайно в дисковійпам’яті. Перенесення цих dirty-блоків назад у БД здійснюється процесом DBWR при настанніоднієї з певних подій, таких як «контрольна точка», «вивантаження файлу» та ін.

Буфер журналу транзакцій зберігає дані про транзакції до тих пір, поки вони не будутьпереписані в оперативний файл журналу транзакцій. Це типовий циклічний буфер – вінзаповнюється від початку до кінця, і потім нова інформація знову записується в початок буфера.Після заповнення вміст буфера процесом LGWR переноситься в оперативний файл журналутранзакцій. Для того щоб гарантувати послідовний характер запису в буфер журналу, серверOracle управляє доступом до нього за допомогою засувок (latch). Така засувка являє собою нещо інше, як блокування процесом Oracle деякої структури в пам’яті – аналогічно блокуваннюфайлу або рядка таблиці. Процес блокує сторонні звернення до пам’яті, виділеної для буферажурналу транзакцій. Таким чином, якщо один процес наклав засувку на буфер, інші не можутьзвернутися до нього до тих пір, поки засувка буде знята. Сервер Oracle обмежує кількістьтранзакцій, дані про яких заносяться в журнал одночасно.

Основи роботи в СУБД Oracle. 109

Page 110: Вступ. Моделі данихa... · 2015-11-09 · Оператор update для модифікації існуючих рядків в існуючих ... 5.3.2. Оператор

11.4 Формування бази даних і екземпляра OracleБаза даних Oracle відкривається в три етапи.

1. Формування екземпляра Oracle (передустановочна стадія).2. Установка БД екземпляром (установча стадія).3. Відкриття БД (стадія відкриття).

Екземпляр Oracle формується на передустановочній стадії запуску системи. На даній стадіїзчитується файл параметрів Init.ora, запускаються фонові процеси і ініціалізується SGA. Цейфайл визначає параметри конфігурації екземпляра, зокрема розмір структур пам’яті, кількість ітип фонових процесів. Ім’я екземпляра встановлюється у відповідності зі значенням змінноїоточення Oracle_SID і необов’язково повинно збігатися з ім’ям БД (але, як правило, збігається).Наступна стадія установочна. Значення параметрів керуючого файлу з Init.ora визначаютьпараметри БД, установлюваної екземпляром. Екземпляр Oracle створює табличний простірSYSTEM, словник даних, один сегмент відкоту і два оперативних файли журналу транзакцій. Націй стадії доступ до керуючого файлу відкритий і можлива модифікація зберігаємих в ньомуданих. На останній стадії відкривається БД. Екземпляр отримує винятковий доступ до файлівБД, імена яких зберігаються в керуючому файлі, і через нього вони стають доступнікористувачеві. Якщо на другому або третьому етапах відбудеться збій, то формується такзваний «порожній» екземпляр Oracle, який сам буде функціонувати, але доступ до БД будевідсутній.

У процесі формування можуть бути отримані екземпляри Oracle різної конфігурації:

екземпляр з типовою структурою;конфігурація Parallel Server;конфігурація Distributed;конфігурація Parallel Query.

Розглянемо докладніше різні конфігурації екземплярів.Екземпляр з типовою структурою включає основні фонові процеси і при необхідності до них

додаються процес архівації – ARCH та / або процес контрольної точки – CKPT.У звичайній конфігурації одній БД відповідає один екземпляр Oracle і, навпаки, одному

екземпляру Oracle повинна відповідати лише одна БД. У конфігурації Parallel Server до однієї і т ієїж фізичної БД може бути підключено кілька екземплярів, що дозволяє декількомкористувачами, розташованим на різних комп’ютерах, спільно використовувати одну БД. Утакому середовищі з паралельним обслуговуванням додатково до основних фонових процесіввикористовується процес блокування LCKn, який відповідає за координацію блокувань БД,встановлюваних різними екземплярами.

Конфігурація Distributed використовується у випадку розподіленої БД. Вона являє механізмирозвиненого симетричного тиражування, які забезпечують можливість поширювати дані поокремих екземплярам (по фізичних БД) за допомогою знімків і відстрочених транзакцій. Операціїтиражування плануються в черги завдань і виконуються у фоновому режимі. На додаток допроцесів блокування ця опція вимагає наявності щонайменше одного фонового процесуоновлення знімка (SNP – snapshot) для виконання робіт, поставлених в чергу. Ця опція вимагає,щоб фоновий процес відновлення RECO завершував розподілені транзакції, які закінчилисяаварійно через відмови мережі або екземпляра.

Конфігурація Parallel Query використовується в тому випадку, якщо комп’ютер, на якомувстановлений екземпляр Oracle, має в наявності кілька процесорів. У цьому випадку додатковозапускаються процеси Pnnn - процеси паралельних запитів. Процеси Pnnn використовуються дляреалізації паралельного виконання окремих частин запиту і беруть участь у формуванні індексіві таблиць.

Основи роботи в СУБД Oracle. 110