登录
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)