2014-05-21 23 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'调用 - 谢谢! –

相关问题