dblink(text connname, text sql [, bool fail_on_error]) returns setof record
dblink(text connstr, text sql [, bool fail_on_error]) returns setof record
dblink(text sql [, bool fail_on_error]) returns setof record
dblinkはリモートデータベースで問い合わせ(通常はSELECTですが行を返す任意のSQLコマンドを行うことができます)を実行します。
2つのtext型の引数が与えられた場合、一番目の引数はまず永続接続の名前を検索するために使われます。
もし見つかれば、コマンドがその接続上で実行されます。
見つからなければ、一番目の引数はdblink_connect用の接続情報文字列として扱われ、このコマンド実行時と同様に指定された接続が開きます。
使用する接続の名前です。 無名の接続を使用する場合はこのパラメータを省略します。
上でdblink_connectで説明した接続情報文字列です。
例えばselect * from fooといった、リモートデータベースで実行させるSQL問い合わせです。
真(省略時のデフォルト)の場合、接続のリモート側で発生したエラーによりローカル側でもエラーが発生します。 偽の場合リモート側のエラーはローカル側にはNOTICEとして報告され、この関数は行を返しません。
この関数は問い合わせにより生成された行を返します。
dblinkは任意の問い合わせで使用することができますので、これは特定の列集合を指定するのではなく、record型を返すものと宣言されています。
これは呼び出し元の問い合わせで想定列集合を指定しなければならないことを意味します。
さもないとPostgreSQLは何が想定されているかわかりません。
以下に例を示します。
SELECT *
FROM dblink('dbname=mydb', 'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';
FROM句の"別名"部分は関数が返す列名とその型を指定しなければなりません。
(別名内の列名の指定はSQL標準の構文ですが、列の型の指定はPostgreSQLの拡張です。)
これによりシステムは、関数を実行する前に、*がどのように展開されるか、WHERE句内のpronameが何を参照するかを理解します。
実行時、リモートデータベースから返る実際の問い合わせの結果がFROM句で示された列数と異なる場合エラーが発生します。
しかし、列名は一致する必要はありません。
また、dblinkは正確な型一致も強制しません。
返されるデータ文字列がFROM句で宣言された列型の有効な入力である限り成功します。
dblinkはリモート側の問い合わせ結果をローカルシステム側に渡す前にすべて取り込みます。
問い合わせが大量の行を返すと想定される場合、dblink_openでカーソルを開き、一度に管理可能な行数を取り出す方が良いでしょう。
前もって判明している問い合わせをdblinkで使用する簡便な方法はビューを作成することです。
これにより問い合わせの度に列型の情報を記載することなく、ビュー内に隠すことができます。
以下に例を示します。
create view myremote_pg_proc as
select *
from dblink('dbname=postgres', 'select proname, prosrc from pg_proc')
as t1(proname name, prosrc text);
select * from myremote_pg_proc where proname like 'bytea%';
select * from dblink('dbname=postgres', 'select proname, prosrc from pg_proc')
as t1(proname name, prosrc text) where proname like 'bytea%';
proname | prosrc
------------+------------
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteanlike | byteanlike
byteain | byteain
byteaout | byteaout
(12 rows)
select dblink_connect('dbname=postgres');
dblink_connect
----------------
OK
(1 row)
select * from dblink('select proname, prosrc from pg_proc')
as t1(proname name, prosrc text) where proname like 'bytea%';
proname | prosrc
------------+------------
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteanlike | byteanlike
byteain | byteain
byteaout | byteaout
(12 rows)
select dblink_connect('myconn', 'dbname=regression');
dblink_connect
----------------
OK
(1 row)
select * from dblink('myconn', 'select proname, prosrc from pg_proc')
as t1(proname name, prosrc text) where proname like 'bytea%';
proname | prosrc
------------+------------
bytearecv | bytearecv
byteasend | byteasend
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteanlike | byteanlike
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteain | byteain
byteaout | byteaout
(14 rows)