Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.Б.Д / лекции / 13БД.doc
Скачиваний:
27
Добавлен:
30.05.2020
Размер:
97.79 Кб
Скачать

13. Лекція: Курсори: принципи роботи:

Мета: Дати визначення курсору. Привести опис його типів і поведінки: статичні, динамічні, послідовні і ключові курсори. Описати принципи управління курсором: створення і відкриття курсору, читання даних, закриття курсору. Навести приклади програмування курсору

ПЛАН

1 Поняття курсору

2 Реалізація курсорів в середовищі ms sql Server

3 Управління курсором в середовищі ms sql Server

Оголошення курсору

Відкриття курсору

Вибірка даних з курсору

Зміна і видалення даних

Закриття курсору

1 Поняття курсору

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

Курсор в SQL – це область в пам'яті бази даних, яка призначена для зберігання останнього оператора SQL. Якщо поточний оператор – запит до бази даних, в пам'яті зберігається і рядок даних запиту, званий поточним значенням, або поточним рядком курсору. Вказана область в пам'яті пойменована і доступна для прикладних програм.

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

Відповідно до стандарту SQL при роботі з курсорами можна виділити наступні основні дії:

  • створення або оголошення курсору ;

  • відкриття курсору, тобто наповнення його даними, які зберігаються в багаторівневій пам'яті ;

  • вибірка з курсору і зміна з його допомогою рядків даних;

  • закриття курсору, після чого він стає неприступним для призначених для користувача програм;

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

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

В деяких випадках вживання курсору неминуче. Проте по можливості цього слід уникати і працювати із стандартними командами обробки даних: SELECT, UPDATE, INSERT, DELETE. Крім того, що курсори не дозволяють проводити операції зміни над всім об’ємом даних, швидкість виконання операцій обробки даних за допомогою курсору помітно нижче, ніж у стандартних засобів SQL.

2 Реалізація курсорів в середовищі ms sql Server

SQL Server підтримує три види курсорів:

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

  • курсори серверу діють на сервері і реалізують програмний інтерфейс додатків для ODBC, OLE DB, DB_Library;

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

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

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

Курсори діляться на дві категорії: послідовні і прокручувані.

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

SQL Server підтримує курсори статичні, динамічні, послідовні і керовані набором ключів.

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

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

В статичний курсор внести зміни неможливо, тому він завжди відкривається в режимі "тільки для читання".

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

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

Послідовні курсори не дозволяють виконувати вибірку даних у зворотному напрямі. Користувач може вибирати рядки тільки від початку до кінця курсору . Послідовний курсор не зберігає набір всіх рядків. Вони прочитуються з бази даних, як тільки вибираються в курсорі, що дозволяє динамічно відбивати всі зміни, що вносяться користувачами в базу даних за допомогою команд INSERT, UPDATE, DELETE. В курсорі доступний самий останній стан даних.

Статичні курсори забезпечують стабільний погляд на дані. Вони застосовні для систем "складування" інформації: додатків для систем звітності або для статистичних і аналітичних цілей. Крім того, статичний курсор краще за інші справляється з вибіркою великої кількості даних. Навпаки, в системах електронних покупок або резервування квитків необхідне динамічне сприйняття інформації, що обновляється, у міру внесення змін. В таких випадках використовується динамічний курсор. В цих додатках об”єм передаваних даних, як правило, невеликий, а доступ до них здійснюється на рівні рядків (окремих записів). Груповий доступ зустрічається дуже рідко.

Соседние файлы в папке лекции