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