2014-05-21 33 views
5

在Postgres裏,你可以使用dblink像這樣鏈接到你的其他數據庫:可能使用PostgreSQL類型來定義一個dblink表?

SELECT * 
FROM dblink (
    'dbname=name port=1234 host=host user=user password=password', 
    'select * from table' 
) AS users([insert each column name and its type here]); 

但是,這是相當冗長。

我使用dblink_connectdblink_disconnect從我的dblink查詢中抽象出連接字符串,縮短了它的範圍。但是,這仍然給我提供了手動表定義(即[insert each column name and its type here])。

而不是手動定義表,有沒有一種方法可以用TYPE或其他任何可重複使用的方法來定義它?

在我的情況下,我必須加入的遠程表的數量和所涉及的列數使得我的查詢非常龐大。

我試圖沿着線的東西:

SELECT * 
FROM dblink (
    'myconn', 
    'select * from table' 
) AS users(postgres_pre_defined_type_here); 

但我收到以下錯誤:

ERROR: a column definition list is required for functions returning "record"

+0

不幸的是,我不認爲有任何方式使用類型爲列定義列表返回'RECORD'功能。 –

+0

記錄可能會轉換爲衆所周知的行類型。但是一套記錄不能,AFAIK。 –

回答

2

當你考慮DBLINK創建幾種類型,你可以接受建立多種功能以及。這些功能將被很好地定義並且非常易於使用。

例子:

create or replace function dblink_tables() 
returns table (table_schema text, table_name text) 
language plpgsql 
as $$ 
begin 
    return query select * from dblink (
     'dbname=test password=mypassword', 
     'select table_schema, table_name from information_schema.tables') 
    as tables (table_schema text, table_name text); 
end $$; 

select table_name 
from dblink_tables() 
where table_schema = 'public' 
order by 1 
+0

是的,封裝函數看起來是最好的解決方案。 –

+0

好主意 - 我從來沒有考慮在自己的函數中包裝我的'dblink'調用 - 謝謝! –

相關問題