32.6. Получение результатов запроса построчно#

32.6. Получение результатов запроса построчно

32.6. Получение результатов запроса построчно

Обычно, libpq собирает результат SQL-команды и возвращает его приложению в виде одного PGresult. Это может быть неприемлемо для команд, возвращающих большое количество строк. В таких случаях приложения могут использовать PQsendQuery и PQgetResult в режиме однострочного режима. В этом режиме строки результата возвращаются приложению по одной, по мере их получения от сервера.

Чтобы войти в режим обработки одной строки, вызовите функцию PQsetSingleRowMode сразу после успешного вызова функции PQsendQuery (или аналогичной функции). Этот режим действует только для текущего выполняющегося запроса. Затем вызывайте функцию PQgetResult повторно, пока она не вернет null, как описано в разделе Раздел 32.4. Если запрос возвращает какие-либо строки, они возвращаются в виде отдельных объектов PGresult, которые выглядят как обычные результаты запроса, за исключением того, что у них есть код состояния PGRES_SINGLE_TUPLE вместо PGRES_TUPLES_OK. После последней строки или немедленно, если запрос не возвращает ни одной строки, возвращается объект с нулевым количеством строк и статусом PGRES_TUPLES_OK; это сигнал о том, что больше строк не будет. (Однако обратите внимание, что все равно необходимо продолжать вызывать функцию PQgetResult до тех пор, пока она не вернет null). Все эти объекты PGresult будут содержать те же данные описания строк (имена столбцов, типы и т. д.), которые имел бы обычный объект PGresult для запроса. Каждый объект должен быть освобожден с помощью функции PQclear как обычно.

Когда используется режим конвейера, для каждого запроса в конвейере необходимо активировать режим одной строки перед получением результатов для этого запроса с помощью PQgetResult. См. Раздел 32.5 для получения дополнительной информации.

PQsetSingleRowMode

Выберите режим одиночной строки для текущего выполняющегося запроса.

int PQsetSingleRowMode(PGconn *conn);

Эта функция может быть вызвана только непосредственно после PQsendQuery или одной из его сопутствующих функций, перед любой другой операцией с соединением, такой как PQconsumeInput или PQgetResult. Если вызвана в правильное время, функция активирует режим одной строки для текущего запроса и возвращает 1. В противном случае режим остается неизменным, и функция возвращает 0. В любом случае режим возвращается к нормальному после завершения текущего запроса.

Предостережение

В процессе обработки запроса сервер может вернуть некоторые строки, а затем столкнуться с ошибкой, что приведет к прерыванию запроса. Обычно libpq отбрасывает такие строки и сообщает только об ошибке. Но в режиме одной строки эти строки уже будут возвращены приложению. Следовательно, приложение увидит некоторые объекты PGRES_SINGLE_TUPLE PGresult, за которыми следует объект PGRES_FATAL_ERROR. Для правильного транзакционного поведения приложение должно быть спроектировано таким образом, чтобы отбросить или отменить все, что было сделано с ранее обработанными строками, если запрос в конечном итоге завершится ошибкой.