Обычно libpq собирает результат выполнения команды SQL целиком и возвращает его приложению в виде одного объекта
PGresult. Это может быть неприемлемо для команд,
возвращающих большое количество строк. В таких случаях приложения могут использовать
PQsendQuery и PQgetResult в
построчный режим или фрагментированном
режиме. В этих режимах строки результата возвращаются приложению по мере их получения от сервера: по одной в построчном режиме или группами во фрагментированном режиме.
Чтобы перейти в один из этих режимов, вызовите функцию PQsetSingleRowMode
или функцию PQsetChunkedRowsMode
сразу после успешного вызова функции PQsendQuery
(или родственной функции). Выбор режима действует только для
текущего выполняемого запроса. Затем повторно вызывайте функцию PQgetResult
до тех пор, пока она не вернет значение NULL, как описано в Раздел 4.1.4. Если в результате выполнения запроса возвращаются строки, они представляются
в виде одного или нескольких PGresult объектов. Эти объекты идентичны обычным результатам запроса, за исключением кода состояния
PGRES_SINGLE_TUPLE для однострочного режима или
PGRES_TUPLES_CHUNK для режима передачи блоками вместо
PGRES_TUPLES_OK. В каждом объекте PGRES_SINGLE_TUPLE содержится ровно одна строка результата, тогда как
объект PGRES_TUPLES_CHUNK содержит как минимум одну
строку, но не более заданного максимального количества строк в блоке.
После последней строки (или сразу, если
запрос не вернул ни одной строки) возвращается объект с нулевым количеством строк и статусом
PGRES_TUPLES_OK это означает; что передача строк завершена. (При этом следует учитывать, что необходимо продолжать
вызов функции PQgetResult до тех пор, пока она не вернет значение NULL.) Все данные PGresult объекты будут содержать те же данные описания строк (имена столбцов, типы и т. д.), что и обычный
PGresult для данного запроса.
Каждый такой объект должен быть освобожден функцией PQclear как обычно.
При использовании конвейерного режима перед получением результатов каждого запроса в конвейере с помощью PQgetResult.
См. Раздел 4.1.5 для получения дополнительной информации.
PQsetSingleRowMode #Выбор однострочного режима для выполняемого в данный момент запроса.
int PQsetSingleRowMode(PGconn *conn);
Данную функцию можно вызывать только непосредственно после вызова функции
PQsendQuery или одной из родственных ей функций,
перед любыми другими операциями с соединением, такими как
PQconsumeInput
или
PQgetResult. При вызове в надлежащий момент
функция активирует однострочный режим для текущего запроса и
возвращает 1. В противном случае состояние режима не меняется, а функция
возвращает 0. В любом случае после завершения текущего запроса восстанавливается обычный
режим.
PQsetChunkedRowsMode #Выбор режима порционной выборки строк для текущего выполняемого запроса.
int PQsetChunkedRowsMode(PGconn *conn, int chunkSize);
Данная функция аналогична функции
PQsetSingleRowMode, за исключением того, что она
определяет получение до chunkSize строк
в одной порции PGresult, а не обязательно только одной строки.
Данную функцию можно вызывать только непосредственно после вызова функции
PQsendQuery или одной из родственных ей функций,
перед любыми другими операциями с соединением, такими как
PQconsumeInput
или
PQgetResult. При вызове в надлежащий момент
функция активирует режим порционной выборки для текущего запроса и
возвращает 1. В противном случае состояние режима не меняется, а функция
возвращает 0. В любом случае после завершения текущего запроса восстанавливается обычный
режим.
В процессе обработки запроса сервер может вернуть часть строк, а затем столкнуться с ошибкой, что приведет к прерыванию выполнения запроса. Как правило, библиотека
libpq отбрасывает такие строки и сообщает только об ошибке. Однако в однострочном или порционном режиме часть строк уже может быть передана приложению. Следовательно, приложение получит несколько
PGRES_SINGLE_TUPLE или PGRES_TUPLES_CHUNK
PGresult
объектов, за которыми последует PGRES_FATAL_ERROR объекта. Для обеспечения корректного транзакционного поведения приложение должно быть спроектировано таким образом, чтобы отбрасывать результаты обработки или отменять любые действия, выполненные с ранее полученными строками, если выполнение запроса в конечном итоге завершится сбоем.