Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD-КН1.doc
Скачиваний:
18
Добавлен:
27.04.2019
Размер:
7.07 Mб
Скачать

Оператор визначения курсора

Стандарт визначає наступний синтаксис оператора визначення курсора:

DECLARE <ім'я курсора> CURSOR FOR <специфікація курсора>

<специфікація курсора> :: = <вираз_запиту SELECT>

Ім'я курсора — це припустимий ідентифікатор в базовій мові програмування. В об'яві курсора можуть бути використані базові змінні. Однак необхідно пам'ятати, що на момент виконання оператора ОРЕN значення всіх базових змінних, використовуваних в якості вхідних змінних в базовому запиті, повинні бути вже задані.

У відповідності зі стандартом SQL2 Transact SQL містить розгорнуте визначення курсора

DECLARE <ім'я курсора> [INSENSITIVE] [SCROLL] CURSOR

FOR <оператор вибору SELECT>

[FOR (READ ONLY | UPDATE [OF <ім'я_стовпця 1> [......n]])]

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

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

Ключове слово SCROLL визначає дозвіл будь-яких режимів переміщення по курсору (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) в операторі FЕТСН. Якщо не вказане ключове слово SCROLL, то вважається допустимим лише стандартне переміщення вперед: специфікація NEXT в операторі FETCH.

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

При використанні параметра UPDATE [OF <ім'я стовпця 1> [,...<ім'я стовпця n>]] ми задаємо перелік стовпців, в яких припустимі зміни в процесі нашої роботи з курсором. Таке обмеження спрощує і прискорює роботу СКБД. Якщо цей параметр не вказаний, то передбачено, що припустимо змінювати всі стовпці курсора.

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

Оператор відкриття курсора

Оператор відкриття курсора має наступний синтаксис:

ОРЕN <ім'я курсора> [USING <список базових змінних>]

Саме оператор відкриття курсора ініціює виконання базового запита, що відповідає опису курсора, заданому в операторі DECLARE _ CURSOR. При виконанні оператора ОРЕN, СКБД виконує семантичну перевірку курсора, що відповідає етапам з 2 по 5 в алгоритмі виконання запитів (рис. 7.1), тому саме тут СКБД повертає коди помилок прикладної програми, які повідомляють їй про результат виконання базового запита. Помилки можуть виникнути в результаті неправильного завдання назв полів або назв вихідних таблиць, або при спробі отримати дані з таблиць, до яких даний користувач не має доступа.

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]