Курсоры

 

Когда результатом выполнения запроса SQL в программном режиме является не одна строка, а целая таблица, необходимо обеспечить для прикладной программы возможность построчного получения результатов запроса. Для этого вводится понятие курсора. Рассмотрим вкратце механизм выполнения многострочного запроса и требуемые для этого новые операторы.

1. Оператор DECLARE CURSOR определяет выполняемый запрос с помощью оператора SELECT и связывает имя курсора с данным запросом.

2. Оператор OPEN инициирует выполнение запроса.

3. Оператор FETCH позволяет последовательно премещаться по строкам таблицы результатов, извлекая данные в базовые переменные.

4. Оператор CLOSE ликвидирует связь между курсором и таблицей результатов.

Оператор DECLARE CURSOR в большинстве СУБД не является выполняемым и должен располагаться в программе перед любыми операторами, работающими с данным курсором.

Обычно оператор FETCH продвигает курсор на следующую строку таблицы результатов. В стандарте SQL92 появилось понятие прокручиваемого курсора, задаваемого параметром SCROLL при его объявлении. Для прокручиваемого курсора в операторе FETCH задается один из параметров FIRST, LAST, NEXT, PRIOR, ABSOLUTE, RELATIVE, что позволяет извлечь соответственно первую строку результата, последнюю, следующую, предыдущую, с определенным номером, с определенным сдвигом по сравнению с текущей строкой. Прокручиваемые курсоры могут потребовать выполнения большого объема вычислений.

Курсоры могут быть обновляемыми, что задается фразой FOR UPDATE при объявлении курсора. Если одна строка результатов запроса строго соответствует определенной строке таблицы, то в процессе просмотра пользователь может обновить или удалить определенные строки курсора и внести соответствующие изменения в базовую таблицу. Например, оператор

DELETE FROM Anketa WHERE CURRENT OF Cursor_Ank

удалит текущую строку из курсора Cursor_Ank, а затем и соответствующую строку из таблицы Anketa. Использование обновляемых курсоров обычно связано с определенными ограничениями.