Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

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 игнорирует параметр BINARY при объявлении курсора PARALLEL RETRIEVE.

INSENSITIVE

Указывает, что данные, извлекаемые из курсора, не должны быть затронуты изменениями базовых таблиц во время существования курсора. В Greengage DB все курсоры нечувствительны к изменениям. Это ключевое слово присутствует для совместимости со стандартом SQL и не имеет эффекта

NO SCROLL

Указывает, что курсор не может использоваться для получения строк в непоследовательном порядке. Это поведение по умолчанию в Greengage DB, так как прокручиваемые курсоры (SCROLL) не поддерживаются

PARALLEL RETRIEVE

Объявляет параллельный курсор. Параллельный курсор — это специальный тип курсора, позволяющий извлекать результаты запроса параллельно, напрямую из сегментов Greengage DB

WITH HOLD
WITHOUT HOLD

WITH HOLD указывает, что курсор может продолжать использоваться после завершения транзакции, в которой он был создан. WITHOUT HOLD указывает, что курсор не может использоваться за пределами создавшей его транзакции. По умолчанию используется WITHOUT HOLD.

ПРИМЕЧАНИЕ

Greengage DB не поддерживает объявление курсора PARALLEL RETRIEVE с параметром WITH HOLD. Параметр WITH HOLD также не может быть указан, если запрос содержит FOR UPDATE или FOR SHARE.

query

Команда SELECT или VALUES, определяющая набор строк, возвращаемых курсором.

Если курсор используется в конструкции WHERE CURRENT OF команд UPDATE или DELETE, команда SELECT должна удовлетворять следующим условиям:

  • Не может ссылаться на представление или внешнюю таблицу.

  • Должна ссылаться только на одну таблицу.

    Таблица должна быть изменяемой. Неизменяемыми являются: табличные функции, функции, возвращающие множества, оптимизированные для добавления таблицы (AO), колоночные таблицы.

  • Не может содержать следующие конструкции:

    • группировку;

    • операции над множествами (например, UNION ALL или UNION DISTINCT);

    • сортировку;

    • оконные функции;

    • соединения или самосоединения.

FOR UPDATE в команде SELECT блокирует выбранные строки, предотвращая их изменение другими сессиями между выборкой и обновлением. Без FOR UPDATE последующие операции UPDATE или DELETE с WHERE CURRENT OF могут не сработать, если строки были изменены после создания курсора.

ПРИМЕЧАНИЕ

Указание FOR UPDATE в команде SELECT блокирует всю таблицу, а не только выбранные строки.

FOR READ ONLY

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.

См. также