Курсори в oracle
Курсор - це покажчик на зарезервований ділянку пам'яті в SGA, де обробляється SQL (SELECT) або DML (UPDATE / INSERT / DELETE) пропозиція.
SGA (Системна Глобальна Область) велику ділянку оперативної пам'яті, зарезервований операційною системою, який використовується для роботи Oracle. У SGA (між іншим) знаходяться пул (shared memory pool) і пул приватної пам'яті (private memory pool), де виконуються PL / SQL-програми. Коли ваш код скомпільовано і завантажений в пам'ять для виконання, визначення курсору завантажується в пул: текст курсора і розібраний код. Під терміном "спільно використовуваний" мається на увазі те, що тільки одна копія існує в пам'яті і означає, якщо Ви і Я обидва вводять один і той же ідентичний запит (запити збігаються по-символьно), ми використовуємо вже розібраний курсор. Oracle знає, що ваш курсор і мій - ідентичні при порівнянні текстової версії курсора. І в цьому випадку Oracle може використовувати той курсор, який вже в пам'яті.
Коли Я виконую свій курсор, інформація, необхідна для обробки, зберігається в пулі приватної пам'яті. В цьому випадку Oracle дозволяє багаторазове використання одного і того ж курсора.
Існує три основних типів курсорів:- неявний,
- явний і
- Курсорні цикли FOR.
Неявний курсор управляється автоматично, прозоро для Вас. В процесі виконання, курсор відкривається, з нього вибираються дані і закривається, все за один шаг.Неявние курсори використовуються тільки в тому випадку, якщо треба повернути єдиний рядок з таблиці. Якщо неявний курсор повинен повернути більше, ніж один рядок, спрацьовує виняток (TOO_MANY_ROWS). Справа в тому, що Ви можете вибирати (SELECT INTO) тільки в скалярні змінні (які мають тільки єдине значення).
Якщо неявний курсор взагалі не повертає рядків, спрацьовує виняток (NO_DATA_FOUND).
Завжди використовуйте неявний курсор разом з його своїм власним обробником винятків.
Типові виключення, які можуть виникати при роботі з курсором: Якщо оголошена змінна типу record, поля якої точно збігаються з даними, затребуваними в операторі SELECT, то можна використовувати конструкцію SELECT INTO. Неявні курсори були оптимізовані для вибору єдиного рядка, і, отже, вони спрацьовують швидше, ніж задані явно: відкриття, вибірка і закриття курсору.
Для посилань на поля записи, використовуються точки. Приклади: Можна також визначити RECORD TYPE і змусити курсор повернути його. Як Ви бачите, спершу це використовується для упакованих курсорів, які Ви хочете зробити загальними. Пакетна специфікація містить тільки опис курсора (ім'я та тип повернення), тоді як (приховано) тіло курсора міститься у виразі SELECT. Обидва компоненти курсора повинні бути узгоджені (match). Тип record використаний для того, щоб забезпечувати зручний тип даних для курсора. Тип record і курсорних фраза SELECT можна порівняти.
Встановлюючи тіло курсора в тілі пакета, Ви можете підтримати твердження курсора легше без необхідності перекомпілювати заголовок пакета, який може вплинути на залежні програмні пристрої.
Курсори мають (4) атрибути:- FOUND Рядок успішно витягнута? (TRUE / FALSE)
- NOTFOUND рядку не залучена? (TRUE / FALSE)
- ISOPEN Курсор відкритий? (TRUE / FALSE)
- ROWCOUNT Кількість витягнутих рядків
Перші три величини Boolean (булеві), а четверта - число. FOUND, NOTFOUND і ROWCOUNT - використовуються для відкритих курсорів. ISOPEN може використовуватися для того, щоб протестувати, які курсори відкриті, а які закриті. Ви використовуєте їх з нотацією атрибута; наприклад: параметризрвані курсори
Явні курсори можуть використовувати параметри: Це хороша практика завжди використовувати параметри, засновані на типах даних таблиці, з якої передбачається їх використовувати.
Ім'я параметра має відрізнятися від імені стовпця в локальному курсорі; в іншому випадку, буде повернута кожен рядок! (X = x завжди TRUE). Будьте послідовні при виборі імен параметрів; наприклад, "завжди використовувати символ С після імені стовпчика" це правило може використовувати, як стандарт при роботі з явними курсором.
Ім'я параметра є просто "заповнювачем" для змінної, яку Ви ставите. Область - строго локальна в тілі курсора. Оскільки курсори є об'єктами тільки для читання, Вам не потрібно визначати потік для параметрів. Потік - завжди в (IN).
Курсорні цикли FOR
Курсорний цикл FOR - ітеративна конструкція, яка дозволяє використовувати OPEN, FETCH, CLOSE курсор в межах циклу. Він дозволяє виконувати операції над кожним рядком, обраної в циклі. Зазвичай він використовується, коли Ви збираєтеся обробляти кожен рядок, яку він повертає. Якщо Вам потрібно перервати цикл передчасно, використовуйте явні курсори (з їх великим управлінням). Висновок з курсору (див. Вище: rec) може використовуватися тільки в циклі. Ви не можете використовувати запис (record) за межами циклу, оскільки вона не існує за межами області циклу. Якщо Вам потрібно бачити значення змінної типу record за межами циклу, призначте йому деяку змінну, певну за межами циклу. Record змінна неявно оголошена з тими ж типами полів, що і рядки курсору, і може бути названа, як завгодно.
Жоден з атрибутів курсора, крім ISOPEN, недоступний за межами циклу, оскільки курсор не відкритий. Якщо Ви намагаєтеся викликати FOUND, NOTFOUND і ROWCOUNT за межами курсора для (FOR) циклу, то отримаєте помилку: ORA-01001: invalid cursor.
Подібно явним курсором, курсор, використаний на курсорі для (FOR) циклу, може також використовувати параметри.
Найпростіший вид курсора для (FOR) циклу являє собою запит, вставлений в опис циклу: