dblink — 在遠端資料庫中執行查詢
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 語句)。
當給出兩個 text
引數時,首先會查詢第一個引數是否為持久連線的名稱;如果找到,則在該連線上執行命令。如果未找到,第一個引數將被視為連線資訊字串,就像 dblink_connect
一樣,並且僅為該命令的持續時間建立指示的連線。
connname
要使用的連線的名稱;省略此引數可使用未命名的連線。
connstr
連線資訊字串,如之前為 dblink_connect
所述。
sql
您希望在遠端資料庫中執行的 SQL 查詢,例如 select * from foo
。
fail_on_error
如果為 true(省略時預設為 true),則遠端連線端發生的錯誤也會導致本地丟擲錯誤。如果為 false,則遠端錯誤將作為 NOTICE 在本地報告,並且函式不返回任何行。
該函式返回查詢產生的行。由於 dblink
可與任何查詢一起使用,因此它被宣告為返回 record
,而不是指定任何特定的列集。這意味著您必須在呼叫查詢中指定預期的列集 — 否則 PostgreSQL 將不知道會期望什麼。下面是一個示例:
SELECT * FROM dblink('dbname=mydb options=-csearch_path=', '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
和預定查詢的便捷方法是建立檢視。這允許將列型別資訊隱藏在檢視中,而無需在每個查詢中拼寫出來。例如:
CREATE VIEW myremote_pg_proc AS SELECT * FROM dblink('dbname=postgres options=-csearch_path=', '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 options=-csearch_path=', '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 options=-csearch_path='); 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 options=-csearch_path='); 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)
如果您在文件中看到任何不正確、與您使用該特定功能時的經驗不符或需要進一步澄清的內容,請使用此表格報告文件問題。