DECLARE
Определение нового курсора.
Синтаксис:
DECLARE курсор [ BINARY ] [ INSENSITIVE ] [ SCROLL ] CURSOR FOR запрос [ FOR { READ ONLY | UPDATE [ OF поле [….]]}]
Параметры:
- курсор. Имя нового курсора.
- BINARY. Выборка данных производится в двоичном формате вместо принятого по умолчанию текстового формата.
- INSENSITIVE. Ключевое слово INSENSITIVE означает, что данные, полученные с использованием курсора, не подвержены изменениям со стороны других процессов (и других курсоров). В PostgreSQL это требование выполняется автоматически, поскольку все операции с курсорами заведомо инкапсулируются в транзакциях. Параметр существует для совместимости с другими системами.
- SCROLL. Ключевое слово SCROLL разрешает выборку нескольких записей при каждой операции FETCH. Режим поддерживается по умолчанию, поэтому наличие ключевого слова SCROLL ни па что не влияет.
- запрос. Запрос SQL, по которому курсор производит выборку записей. Структура запроса приведена в описании команды SELECT.
- READ ONLY. Курсор используется только для чтения данных. Наличие параметра READ ONLY ни на что не влияет, поскольку в PostgreSQL курсорам представляется доступ только для чтения.
- UPDATE. Курсор используется для обновления таблиц. В PostgreSQL версии 7.1.x (последней на момент написания книги) обновление через курсоры не поддерживается.
- поле. Список полей, обновляемых курсором. В PostgreSQL версии 7.1.x (последней на момент написания книги) обновление через курсоры не поддерживается.
Результаты:
- SELECT. Сообщение выдается при успешном выполнении команды SELECT.
- NOTICE: Closing pre-existing portal "курсор". Сообщение означает, что в текущем транзакционном блоке уже был объявлен курсор с заданным именем. В этом случае ранее объявленный курсор автоматически уничтожается.
- ERROR: DECLARE CURSOR may only be used in begin/end transaction blocks. Ошибка – попытка объявления курсора вне трапзакционного блока. Курсоры используются только в транзакционных блоках.
Описание
Команда DECLARE создает в транзакционном блоке курсор, предназначенный для выборки данных, полученных в результате запроса. Возвращаемые данные могут храниться в текстовом или двоичном формате. Курсоры поддерживаются только в контексте транзакций, при попытке их использования вне транзакционного блока выдается сообщение об ошибке.
Внимание
При использовании двоичных (BINARY) курсоров необходима осторожность, поскольку они не поддерживаются некоторыми клиентами.
PostgreSQL не требует отдельного открытия курсоров – курсоры открываются автоматически при объявлении. Тем не менее препроцессор ecpg поддерживает команду OPEN для встроенных и интерактивных приложений SQL.
Пример
В следующем фрагменте объявляется курсор cur_publisher, который затем используется для выборки двух записей. В клиенте psql результаты выборки отображаются немедленно.
booktown=# BEGIN WORK; BEGIN booktown=# DECLARE cur_publisher CURSOR FOR SELECT name FROM publishers: SELECT booktown=# FETCH FORWARD 2 IN cur_publisher; name Kids Can Press Henry Holt & Company. Inc. (2 rows)