可以使用 PostgreSQL 类型来定义 dblink 表吗?

Posted

技术标签:

【中文标题】可以使用 PostgreSQL 类型来定义 dblink 表吗?【英文标题】:Possible to use a PostgreSQL TYPE to define a dblink table? 【发布时间】:2014-05-21 18:34:09 【问题描述】:

在 Postgres 中,您可以使用 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"

【问题讨论】:

不幸的是,我认为没有任何方法可以将类型用作返回 RECORD 的函数的列定义列表。 一条记录可能被转换为一个众所周知的行类型。但是一组记录不能,AFAIK。 【参考方案1】:

当您考虑为 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

【讨论】:

是的,作为包装器的函数似乎是最好的解决方案。 好主意——我从未考虑过将我的dblink 调用包含在它们自己的函数中——谢谢!

以上是关于可以使用 PostgreSQL 类型来定义 dblink 表吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用mybatis中的自定义TypeHandler处理PostgreSQL中的Json类型字段

PostgreSQL安装及简单使用

postgresql是啥数据库

是否可以在 postgresql 的另一个模式中使用一个模式的枚举类型

1. PostgreSQL-安装和基本配置(学习笔记)

postgresql----数组类型和函数