dblink_get_result#
dblink_get_result
dblink_get_result — получает асинхронный результат запроса
Синтаксис
dblink_get_result(text connname [, bool fail_on_error]) returns setof record
Описание
dblink_get_result
собирает результаты асинхронного запроса, отправленного ранее с помощью dblink_send_query
.
Если запрос еще не завершен, dblink_get_result
будет ждать, пока он не будет выполнен.
Аргументы
connname
Имя соединения, которое нужно использовать.
fail_on_error
Если значение true (по умолчанию, если не указано), то ошибка, возникшая на удаленной стороне соединения, также вызывает ошибку на локальной стороне. Если значение false, то удаленная ошибка сообщается локально как NOTICE, и функция не возвращает ни одной строки.
Возвращаемое значение
Для асинхронного запроса (то есть SQL-запроса, возвращающего строки) функция возвращает строку(и), полученную(ые) из запроса. Чтобы использовать эту функцию, вам потребуется указать ожидаемый набор столбцов, как уже обсуждалось для функции dblink
.
Для асинхронной команды (то есть SQL-запроса, не возвращающего строки) функция возвращает одну строку с одним текстовым столбцом, содержащим строку состояния команды. Все равно необходимо указать, что результат будет иметь один текстовый столбец в вызывающем предложении FROM
.
Примечания
Эта функция должна быть вызвана, если
dblink_send_query
вернула 1.
Она должна быть вызвана один раз для каждого отправленного запроса,
и еще один раз для получения пустого результата,
прежде чем соединение можно будет использовать снова.
При использовании функций dblink_send_query
и dblink_get_result
dblink извлекает все результаты удаленного запроса перед возвратом их локальному обработчику запросов. Если запрос возвращает большое количество строк, это может привести к временному раздутию использования памяти в локальной сессии. Возможно, лучше открыть такой запрос как курсор с помощью функции dblink_open
и затем извлекать управляемое количество строк по мере необходимости. Также можно использовать простую функцию dblink()
, которая избегает раздутия использования памяти путем записи больших наборов результатов на диск.
Примеры
contrib_regression=# SELECT dblink_connect('dtest1', 'dbname=contrib_regression'); dblink_connect ---------------- OK (1 row) contrib_regression=# SELECT * FROM contrib_regression-# dblink_send_query('dtest1', 'select * from foo where f1 < 3') AS t1; t1 ---- 1 (1 row) contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]); f1 | f2 | f3 ----+----+------------ 0 | a | {a0,b0,c0} 1 | b | {a1,b1,c1} 2 | c | {a2,b2,c2} (3 rows) contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]); f1 | f2 | f3 ----+----+---- (0 rows) contrib_regression=# SELECT * FROM contrib_regression-# dblink_send_query('dtest1', 'select * from foo where f1 < 3; select * from foo where f1 > 6') AS t1; t1 ---- 1 (1 row) contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]); f1 | f2 | f3 ----+----+------------ 0 | a | {a0,b0,c0} 1 | b | {a1,b1,c1} 2 | c | {a2,b2,c2} (3 rows) contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]); f1 | f2 | f3 ----+----+--------------- 7 | h | {a7,b7,c7} 8 | i | {a8,b8,c8} 9 | j | {a9,b9,c9} 10 | k | {a10,b10,c10} (4 rows) contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]); f1 | f2 | f3 ----+----+---- (0 rows)