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
真(省略時のデフォルト)の場合、接続のリモート側で発生したエラーによりローカル側でもエラーが発生します。 偽の場合リモート側のエラーはローカル側にはNOTICEとして報告され、この関数は行を返しません。
非同期問い合わせ(行を返すSQL文の場合)について、この関数は問い合わせで生成された行を返します。
この関数を使用するためには、上のdblink
で説明したように想定する列集合を指定する必要があります。
非同期コマンド(行を返さないSQL文の場合)について、この関数はコマンド状態文字列からなるテキスト列を1つ持つ1行を返します。
この場合も呼び出し元の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)