DECLARE
Объявляет курсор.
Синтаксис
DECLARE <name> [BINARY] [INSENSITIVE] [NO SCROLL] [PARALLEL RETRIEVE] CURSOR
[{WITH | WITHOUT} HOLD]
FOR <query> [FOR READ ONLY]
Описание
DECLARE позволяет создать курсор для последовательного извлечения небольших порций строк из большого набора результатов запроса.
Курсоры могут возвращать данные в текстовом или двоичном формате с использованием команды FETCH.
На этой странице описывается использование курсоров на уровне SQL-команд. Если вы пытаетесь использовать курсоры внутри функции PL/pgSQL, правила будут другими.
Обычные курсоры возвращают данные в текстовом формате, как и результат команды SELECT.
Поскольку данные внутри системы хранятся в двоичном формате, при выборке текстовых данных выполняется преобразование из двоичного в текстовое представление.
После получения данных в текстовом виде клиентскому приложению может потребоваться обратное преобразование в двоичный формат для дальнейшей обработки.
Кроме того, текстовое представление данных обычно занимает больше места, чем двоичное.
Двоичные курсоры возвращают данные непосредственно во внутреннем двоичном представлении, что может упростить их обработку.
Однако, если данные предназначены для отображения в текстовом виде, их получение сразу в текстовом формате позволяет снизить нагрузку на стороне клиента.
Например, если запрос возвращает значение 1 из целочисленного столбца, обычный курсор вернет строку '1', а двоичный курсор — четырехбайтовое значение, содержащее внутреннее представление числа в порядке big-endian.
Двоичные курсоры следует использовать осторожно.
Многие приложения, включая psql, не предназначены для работы с двоичными курсорами и ожидают данные в текстовом формате.
При использовании расширенного протокола запросов для выполнения команды FETCH в сообщении Bind этого протокола указывается, в каком формате (текстовом или двоичном) должны быть получены данные.
Этот выбор переопределяет способ объявления курсора.
Таким образом, при использовании расширенного протокола запросов концепция двоичного курсора устаревает — любой курсор можно использовать как в текстовом, так и в двоичном режиме.
Курсор можно использовать в конструкции WHERE CURRENT OF команд UPDATE или DELETE для обновления или удаления строк таблицы.
Команды UPDATE и DELETE с использованием курсора могут выполняться только на сервере, например, в интерактивной сессии psql или в SQL-скрипте.
Процедурные языки, такие как PL/pgSQL, не поддерживают изменяемые курсоры.
Параллельные курсоры
Greengage DB поддерживает специальный тип курсора — параллельный курсор (PARALLEL RETRIEVE CURSOR).
Он позволяет получать результаты запроса параллельно, напрямую с сегментов Greengage DB, минуя мастер.
Параллельные курсоры не поддерживают выражение WITH HOLD.
При объявлении параллельного курсора Greengage DB игнорирует параметр BINARY.
Для работы с параллельным курсором необходимо открыть отдельную сессию получения для каждой конечной точки курсора и использовать команду RETRIEVE для извлечения результатов запроса.
Параметры
| Параметр | Описание |
|---|---|
name |
Имя создаваемого курсора |
BINARY |
Указывает, что курсор должен возвращать данные в двоичном, а не в текстовом формате. ПРИМЕЧАНИЕ
Greengage DB игнорирует параметр |
INSENSITIVE |
Указывает, что данные, извлекаемые из курсора, не должны быть затронуты изменениями базовых таблиц во время существования курсора. В Greengage DB все курсоры нечувствительны к изменениям. Это ключевое слово присутствует для совместимости со стандартом SQL и не имеет эффекта |
NO SCROLL |
Указывает, что курсор не может использоваться для получения строк в непоследовательном порядке.
Это поведение по умолчанию в Greengage DB, так как прокручиваемые курсоры ( |
PARALLEL RETRIEVE |
Объявляет параллельный курсор. Параллельный курсор — это специальный тип курсора, позволяющий извлекать результаты запроса параллельно, напрямую из сегментов Greengage DB |
WITH HOLD |
ПРИМЕЧАНИЕ
Greengage DB не поддерживает объявление курсора |
query |
Если курсор используется в конструкции
ПРИМЕЧАНИЕ
Указание |
FOR READ ONLY |
|
Примечания
Если параметр WITH HOLD не указан, курсор действителен только в пределах текущей транзакции.
Команда DECLARE без WITH HOLD не имеет смысла вне транзакционного блока: курсор существует лишь до завершения команды.
Поэтому Greengage DB выдаст ошибку при попытке использовать курсор вне транзакции.
Для определения транзакционного блока используйте команды BEGIN и COMMIT (или ROLLBACK).
Если указан параметр WITH HOLD и транзакция, создавшая курсор, успешно завершается, курсор остается доступным для последующих транзакций той же сессии.
Если же транзакция откатывается, курсор удаляется.
Курсор с WITH HOLD закрывается при выполнении команды CLOSE или при завершении сессии.
В текущей реализации строки, доступные через удерживаемый курсор, сохраняются во временном файле или в памяти, чтобы оставаться доступными для последующих транзакций.
Если курсор создан командой DECLARE внутри транзакции, команда SET не может использоваться в этой транзакции до закрытия курсора командой CLOSE.
Прокручиваемые курсоры не поддерживаются в Greengage DB.
Курсор можно перемещать только вперед с помощью команд FETCH или RETRIEVE, но не назад.
Конструкция DECLARE … FOR UPDATE не поддерживается для оптимизированных для добавления (AO) таблиц.
Список всех доступных курсоров можно получить через системное представление pg_cursors.
Примеры
Объявление курсора:
DECLARE mycursor CURSOR FOR SELECT * FROM mytable;
Объявление параллельного курсора для того же запроса:
DECLARE myprcursor PARALLEL RETRIEVE CURSOR FOR SELECT * FROM mytable;
Совместимость
Стандарт SQL разрешает использование курсоров только во встраиваемом SQL и в модулях. Greengage DB позволяет использовать курсоры в интерактивном режиме.
Greengage DB не реализует команду OPEN для курсоров.
Курсор считается открытым сразу при его объявлении.
Стандарт SQL позволяет курсорам перемещаться как вперед, так и назад. Все курсоры в Greengage DB перемещаются только вперед и не являются прокручиваемыми.
Двоичные курсоры — расширение Greengage DB.
Параллельные курсоры не предусмотрены стандартом SQL.