Использование курсоров
21. Использование курсоров
21.1. Что такое курсоры
Операции выборки SQL работают с наборами строк, которые называются результирующими множествами.
Иногда бывает необходимо просмотреть строки в прямом или обратном направлении один или несколько раз. Именно для этого используются курсоры.
Курсор представляет собой запрос к базе данных, хранящийся на сервере СУБД, = это не оператор SEECT, но результирующее множество, выборка, полученная в результате действия оператора SELECT. После того как курсор сохранен, приложение может просматривать данные в прямом или обратном направлении.
Различные СУБД поддерживают разные опции и возможности курсоров. Наиболее часто обеспечиваются следующие возможности.
· Возможность помечать курсор как предназначенный только для чтения, в результате чего данные могут считываться, но не могут обновляться или удаляться.
· Возможность управлять направлением выполняемых операций (вперед, назад, первая, последняя, абсолютное положение, относительное положение и т.д.).
· Возможность помечать некоторые столбцы как редактируемые, а другие – как нередактируемые.
Рекомендуемые материалы
· Указание области видимости, благодаря чему курсор может быть доступен или для запроса, посредством которого он был создан или для всех запросов.
· Указание СУБД скопировать выбранные данные, чтобы они не изменялись в промежуток времени между открытием курсора и обращением к нему.
Курсоры как часть спецификации SQL интересны тем, что с их помощью можно заставить реляционную базу данных вести себя подобно базе данных типа ISAM (Indexed Sequential Access Method) индексно-последовательный метод доступа.
Курсоры используются главным образом интерактивными приложениями, представляющими пользователям возможность просматривать отображаемые на экране данные вперед и назад.
Курсоры практически бесполезны, если их применять к приложениям, основанным на Web-технологиях, например, таких как ASP, PHP. Курсоры предназначены идля использования в течение сеанса связи между клиентским приложением и серверном, но эта модель «клиент-сервер» не годится для Web-приложений, потому что сервер приложений является клиентом базы данных, а не конечным пользователем. А раз так, то большинство разработчиков приложений избегают использование курсоров и добиваются выполнения нужных функций, если это необходимо, другими возможностями.
21.2. Работа с курсорами
Работа с курсорами содержит.
· Прежде чем курсор может быть использован, его необходимо объявить. В ходе этого процесса выборка данных не производится, просто определяется оператор SELECT, который будет использован, и некоторые опции курсора.
· После объявления курсор может быть открыт для использования. В ходе этого процесса уже производится выборка данных согласно предварительно определенному оператору SELECT.
· После того как курсор заполнен данными, могут быть извлечены отдельные необходимые строки.
· После того как это сделано, курсор должен быть закрыт и, возможно, должны быть освобождены ресурсы, которые он занимал.
После того как курсор объявлен, его можно открывать, закрывать сколько необходимо. Если курсор открыт, операция выборки может выполняться сколько необходимо раз.
21.3. Создание курсоров
Курсоры создаются с помощью оператора DECLARE, синтаксис которого различен для разных СУБД. Оператор DECLARE дает курсору имя и принимает оператор SELECT дополненный при необходимости предложением WHERE и другими.
В качестве примера создадим курсор, который будет делать выборку всех клиентов, и не имеющих адресов электронной почты, в виде части приложения, позволяющего служащему вводить недостающие адреса.
Для SQL Server
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust_email IS NULL
Для Oracle
DECLARE CustCursor CURSOR
IS
SELECT * FROM Customers
WHERE cust_email IS NULL
Для определения имени курсора используется оператор DECLARE. После того как курсор определен, его можно открыть.
21.4. Использование курсоров
Курсоры открываются с помощью оператора OPEN CURSOR, в котором указывается имя открываемого курсора.
При обработке оператора выполняется запрос к базе данных. Выборка данных сохраняется для последующих просмотров и прокрутки.
Доступ к данным этого курсора может быть получен с помощью оператора FETCH. Оператор FETCH указывает строки, которые должны быть выбраны, откуда они должны быть выбраны и где их следует сохранить.
Для Oracle
DECLARE TYPE custCursor IS REF CURSOR
RETURN CustomERS%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
OPEN CustCursor;
FETCH CustCursor INTO CustRecord;
CLOSE CustCursor;
END;
В данном примере оператор FETCH используется для выборки текущей строки. Автоматически он начинает с первой строки, в переменную, объявленную с именем CustRecord, С выбранными данными ничего не делается.
В следующем примере выбранные данные подвергаются циклической обработке от первой строки до последней.
DECLARE TYPE custCursor IS REF CURSOR
RETURN CustomERS%ROWTYPE;
DECLARE CustRecord Customers%ROWTYPE
BEGIN
OPEN CustCursor;
LOOP
FETCH CustCursor INTO CustRecord;
EXIT WHEN CustCursor%NOTFOUND
. . .
CLOSE CustCursor;
END;
Здесь также используется оператор FETCH для выборки текущей строки в переменную, объявленную с именем CustRecord. Однако в отличие от предыдущего примера, здесь оператор FETCH находится внутри цикла LOOP, так что он выполняется снова и снова. Код EXIT WHEN CustCursor%NOTFOUND указывает, что этот процесс должен быть завершен, когда больше не останется строк для выборки.
21.5. Закрытие курсоров
В лекции "19. Истечение жидкости через отверстия" также много полезной информации.
После использования курсоров их нужно закрывать. В некоторых СУБД, например SQL Server, требуется, чтобы ресурсы, занятые курсором, были освобождены явным образом. Для закрытия курсора используется оператор CLOSE. После того как курсор закрыт, его нельзя использовать, не открыв перед этим вновь
Для Oracle
CLOSE CustCursor
Для SQL Server
CLOSE CustCursor
DEALLOCATE CURSOR CustCursor