
- •Формирование запросов к базе данных.
- •Множественные операции
- •Order by
- •For update of
- •Последовательности
- •Фразы оператора select
- •Фраза from
- •Фразы group by и having
- •Фраза having
- •Фраза where
- •Фраза where (Встроенный sql)
- •Фраза current of
- •Фразы connect by и start with
- •Start with
- •Использование order by
- •Фраза order by
- •Внешнее объединение
- •Подзапросы.
- •Функции агрегирования результатов запроса
- •Курсоры
- •Види курсоров
- •Объявление курсора.
- •Открытие курсора
- •Атрибуты курсора.
- •Чтение данных с использованием курсора.
- •Закрытие курсора
- •Неявные курсоры. Предопределенный курсор sql.
- •Примеры работы с курсорами
- •Изменение и удаление данных в позиции курсора.
- •Переменные-курсоры.
- •Работа с транзакциями в pl/sql.
- •Курсоры и транзакции.
Курсоры
Види курсоров
Курсор - это конструкция языка SQL, предназначенная для связи между результатом запроса, который возвращает некоторое множество данных (обычно более одной записи), и программой на PL/SQL (или, в общем случае, прикладной программой), которая должна обрабатывать результаты этого запроса по одной записи. Курсор преобразует результат в набор записей, по которым можно перемещаться в цикле в программе.
Различают явные и неявные курсоры.
Явные курсоры программист объявляет сам, неявные курсоры связываются с каждым SQL-запросом.
Курсор является общим понятием, не ограниченным языком PL/SQL - во всех
Вот обычная последовательность действий для работы с курсором:
1) объявить его в разделе объявлений CURSOR имя-курсора IS запрос;
2) открыть его с помощью OPEN имя-курсора;
3) используя цикл, считать данные с помощью оператора FETCH (или воспользоваться специальной формой цикла FOR);
4) закрыть курсор по CLOSE имя-курсора.
Объявление курсора.
Перед тем, как курсор использовать, его нужно объявить в разделе объявлений:
DECLARE
CURSORимя-курсора [(параметры)]IS
SELECT-оператор [FOR UPDATE NOWAIT];
SELECT-оператор определяет запрос, на основании которого получаются данные, по которым мы перемещаемся курсором. В данном операторе допустимо ORDER BY, в этом случае набор данных будет отсортирован.
В SELECT-операторе для курсора допускается использование переменных PL/SQL, выражений, допустимых в PL/SQL и вызов функций. Следует иметь в виду, что если в операторе используется колонка таблицы и переменная с одним и тем же именем, приоритет будет иметь колонка таблицы. Для разрешения этого конфликта проще всего переименовать переменную. Параметры курсора разделяются запятыми и доступны по имени внутри курсора в операторе SELECT. Задаются аргументы для этих параметров при открытии курсора с помощью OPEN. Параметры указываются вместе с типами.
Для параметров допускаются значения по умолчанию.
FOR UPDATE означает, что курсор предназначается для того, чтобы через него изменять записи и поставит блокировку. NOWAIT означает, что курсор не будет ждать, пока освободится ресурс, который нужно заблокировать, а сразу же вернет управление (с индикацией ошибки).
Пример курсора без параметров:
DECLARE
CURSOR emp_cursor IS SELECT * FROM Employee;
Пример курсора с параметрами (один параметр типа INT):
DECLARE
CURSOR emp1_cursor (min_emp_id INT) IS
SELECT * FROM Employee WHERE emp_id > min_emp_id;
Пример курсора с использованием переменной PL/SQL:
DECLARE
future_bonus NUMBER := 100;
CURSOR emp_cur IS
SELECT salary+future_bonus new_salary FROM Employee;
Перемещение по записям в курсоре в Oracle может осуществляться только в одну строну по набору данных - от начала в конец и если требуется вернуться назад, нужно открывать курсор заново. Такой курсор называется нескроллируемым.
Открытие курсора
Объявление курсора сходно с описанием типа - оно задает формат получаемых данных, но для того, чтобы действительно получить эти данные, курсор необходимо открыть.
Для того, чтобы открыть курсор, необходимо выполнить оператор
OPEN имя-курсора[(аргументы)];
При этом курсор будет установлен перед первой записью набора. Для того, чтобы получить реальные данные, необходимо использовать FETCH.
Пример
OPEN emp_cursor;
откроет предварительно объявленный курсор emp_cursor.
OPEN emp1_cursor(101);
откроет курсор emp1_cursor и передаст ему в качестве параметра 101.
Один раз объявленный курсор может быть открыт много раз, но его нужно каждый раз перед этим закрывать - при попытке открыть уже открытый курсор получится ошибка.