You are on page 1of 21

National Technical University of Ukraine "Igor Sikorsky Kyiv

Polytechnic Institute"

Організація баз даних-1


Лекція 2.

ПОБУДОВА ПРЕДСТАВЛЕНЬ ТА КУРСОРІВ.


План лекції:
1. Представлення;
2. Операції над представленнями;
3. Курсори;
4. Послідовність роботи з курсором.
Представлення
Представлення - це віртуальна таблиця, яка сама по собі не
існує, але для користувача виглядає так, наче вона існує.
Представлення не підтримується його власними даними, які
зберігаються фізично. Замість цього в каталозі таблиць
зберігається визначення, яке показує, з яких стовпчиків і рядків
інших таблиць воно повинно бути сформоване при реалізації
SQL-команди на отримання даних з представлення або на
модифікацію таких даних.
Представлення реально є деяким запитом, який зберігається в
БД.
Для користувача представлення нічим не відрізняється від
базової таблиці БД (з урахуванням технічних обмежень).
Створення та знищення представлення
В стандарті SQL оператор визначення представлення має наступний
синтаксис:

CREATE VIEW <ім`я представлення> [(<ім`я стовпчику> [, <ім`я


стовпчику>...])]
AS <запит> [WITH CHECK OPTION]

Ім'я стовпчика (поля) в представленні необхідне в разі коли поле


обчислюється за виразом, інакше ім'я береться з базової таблиці.
WITH CHECK OPTION - визначає, чи можна вводити записи для
представлення, які не задовольняють умовам формування
представлення WHERE (тобто для операцій INSERT і UPDATE над цим
представленням повинна здійснюватися перевірка, яка забезпечує
виконання фрази WHERE підзапиту. Якщо WITH CHECK OPTION у
визначенні представлення буде відсутній, такий контроль не
проводиться.)
Створення та знищення представлення

Створена таблиця представлення є змінною (тобто до неї можна


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

В реалізаціях ці обмеження можуть бути послаблені. Але якщо


прагнути до мобільності, не слід користуватися розширеними
можливостями.
Створення та знищення представлення
приклад створення представлення на основі двох таблиць Zamovl і
Customer:
CREATE VIEW cust_zak AS
SELECT customer.name1, customer.adres, custpmer.tel, zamovl.model
FROM customer, zamovl
WHERE customer.nom_pokup=zamovl.nom_pokup

CREATE VIEW snow_line (city, state, snown_altitude) AS


SELECT city, state, altitude
FROM cities
WHERE altitude > 5000

CREATE VIEW half_mile_cities AS


SELECT city, state, altitude FROM cities
WHERE altitude > 2500
WITH CHECK OPTION

Знищення непотрібних представлень виконується за допомогою команди:


DROP VIEW <представлення>
Операції над представленнями
Операції SELECT, DELETE, INSERT і UPDATE можуть оперувати не
тільки базовими таблицями, але й представленнями. Але, якщо з
базових таблиць можна видаляти будь-які рядки, поновлювати
значення будь-яких їхніх стовпчиків і вводити у такі таблиці нові рядки,
то цього не можна сказати про представлення, не всі з яких можуть
поновлюватися.
Представлення, отримані з однієї базової таблиці (наприклад, шляхом
вилучення деяких її рядків і (або) стовпчиків), можна поновлювати.

Наприклад можна давати такі команди:


UPDATE cust_zak SET adres=’Київ’ WHERE adres=’Полтава’
UPDATE cust_zak SET nom_prod=5 WHERE adres=’Полтава’

Але не можна виконати таку команду:


UPDATE cust_zak SET adres=’Київ’, nom_prod=5 WHERE
adres=’Полтава’
Операції над представленнями

Модифікації, які діють на дві і більше таблиці - недопустимі. Якщо


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

Оскільки при визначенні представлення може бути використаний


любий допустимий підзапит, то вибірка даних може
здійснюватися як з базових таблиць, так і з представлень.
По створеним представленням можна робити запити.
Наприклад, одержати всю необхідну інформацію можна за
допомогою єдиного запиту:
SELECT *
FROM cust_zak
Одна з основних задач, яку дозволяють вирішувати представлення, -
забезпечення незалежності програм користувача від зміни логічної
структури бази даних при її розширенні і (або) зміні розміщення
стовпчиків, що виникає, наприклад, при розщепленні таблиць. В
останньому випадку можна створити представлення-з`єднання з
ім'ям і структурою розщепленої таблиці, яке дозволить зберегти
програми, що існували до зміни структури бази даних.
Крім того, представлення дають можливість різним користувачам по-
різному бачити одні й ті ж дані, можливо, навіть в один і той же час.
Це особливо цінно при роботі різних категорій користувачів з єдиною
інтегрованою базою даних. Користувачам надають тільки дані, що їх
цікавлять, в найбільш зручній для них формі (вікно в таблицю або в
любе з`єднання будь-яких таблиць).
Нарешті, від певних користувачів можуть бути приховані деякі дані,
невидимі через запропоноване їм представлення. Таким чином,
примус користувача здійснювати доступ до бази даних через
представлення є простим, але ефективним механізмом для
управління санкціонуванням доступу.
Збереженні процедури

 Збережені процедури - це об'єкти бази даних, що розташовані на


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

Курсор є покажчиком на окремий запис тієї чи іншої


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

Для використання курсору потрібно:


1. Створити курсор.
2. Відкрити курсор для використання в додатку чи збереженій
процедурі.
3. Ініціювати за допомогою курсору послідовне перебирання
записів з метою їхньої обробки.
4. Закрити курсор після завершення роботи з ним (з можливим
наступним відкриттям у разі потреби).
5. Видалити курсор.
На відміну від таблиць, індексів, тригерів та збережених процедур,
курсори не є об'єктами бази даних.
Курсори
Курсори дозволяють проводити операції з записами в наборі,
створеному з допомогою команди SELECT. Курсор SQL - це ті рядки,
які задовольняють запит.
Курсор - це засіб мови SQL, який дозволяє отримати послідовний
доступ до рядків віртуальної таблиці, отриманої як результат SQL-
запиту. Для роботи з курсором необхідно спочатку оголосити курсор,
тобто визначити множину рядків, які пов'язуються з курсором, а
потім (в циклі ) звертатися до цих рядків. Слід зауважити, що різні
сервери реалізують різни варіанти оголошення та використання
курсорів.
Опис курсору
Опис курсору здійснюється за допомогою команди:
DECLARE <ім`я курсора> CURSOR FOR < select >
[FOR UPDATE OF <col> [, <col >...]]

Оператор DECLARE не є активним оператором, він тільки


встановлює властивості курсора і виділяє для нього пам`ять.
FOR UPDATE OF - вказує на можливості редагування та вилучення
рядків з таблиці за допомогою операторів UPDATE і DELETE
В описі курсора можуть задаватися запити найбільш загального виду
з можливістю виконання операції UNION, GROUP BY, DISTINCT,
ORDER BY, HAVING. Якщо використовують ці опції, то курсор буде
доступним тільки для читання, в інших випадках курсор може
поновлюватись.

DECLARE c CURSOR FOR


SELECT cust_no, order_status
FROM sales
WHERE order_status IN (‘open’, ‘shipping’)
Відкриття курсору
Оператор описується наступним синтаксичним правилом:
OPEN <ім`я курсора>

Оператор OPEN активізує курсор. Він передає асоційований з курсором


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

При виконанні цього оператора проводиться підготовка курсору до роботи над


ним.
Наступні оператори можна виконувати над відкритим курсором в довільному
порядку.
Зчитування чергового рядка курсору
Синтаксис оператора зчитування наступний:

FETCH < ім`я курсора > INTO <змінна результату> [, < змінна
результату >...]

В операторі читання вказується ім'я курсору і обов'язковий розділ


INTO, що має список специфікацій призначення (список імен змінних
основної програми у випадку вбудованого SQL або імен "вихідних"
параметрів у випадку модуля SQL). Число і типи даних в списку
призначень повинні співпадати з числом і типами даних списку вибірки
специфікації курсору.
Будь-який відкритий курсор завжди має позицію: він може бути
встановлений перед деяким рядком результуючої таблиці (перед
першим рядком відразу після відкриття курсору), на деякий рядок
результату або за останнім рядком результату.
Зчитування чергового рядка курсору
 Якщо таблиця, на яку вказує курсор пуста, або позиція курсора
знаходиться на останньому рядоку чи за ним, то при виконанні
оператора читання курсор встановлюється в позицію після
останнього рядка, параметру SQLCODE присвоюється значення
100, і ніякі значення не присвоюються змінним, вказаним в
розділі INTO.

 Якщо курсор встановлений в позицію перед рядком, то при


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

 Якщо курсор встановлений на рядок r, відмінний від останнього


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

Синтаксис цього оператора наступний:

DELETE FROM <table name> WHERE CURRENT OF <cursor


name>

Якщо вказаний в операторі курсор відкритий і встановлений на


деякий рядок, і курсор визначає змінну таблицю, то поточний
рядок курсору видаляється з таблиці, а курсор позиціонується
перед наступним рядком. Таблиця, вказана в розділі FROM
оператора DELETE, повинна бути таблицею, вказаною в самому
зовнішньому розділі FROM специфікації курсору.
Оператор позиційної модифікації
Оператор описується наступними синтаксичними правилами:

UPDATE <table name> SET {<column name> | <value expression> |


NULL }
[{,<column name> | <value expression> |
NULL }...]
WHERE CURRENT OF <cursor name>

table name - ім'я таблиці.


column name - ім'я поля.
value expression - вираз для обчислення значення.
cursor name - ім'я курсора.

Якщо вказаний в операторі курсор відкритий і встановлений на деякий


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

Синтаксис цього оператора наступний:

CLOSE < ім`я курсора >

Якщо на час виконання цього оператора курсор знаходився у


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

• Деякі СКБД надають можливість створювати тимчасові


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

You might also like