如何访问外表上的大对象存储

时间:2018-06-11 19:05:29

标签: postgresql postgres-fdw

我已经设置了postgres_fdw来访问“远程”数据库(事实上它在同一台服务器上)。工作良好。除了其中一列是大对象的oid之外,我该如何读取该数据?

2 个答案:

答案 0 :(得分:0)

我找到了如何做到这一点。也可以通过pg_largeobject表访问大对象库。所以我做了

create foreign table if not exists global_lo (
    loid oid not null,
    pageno integer not null,
    data bytea 
)
server glob_serv options(table_name 'pg_largeobject', schema_name 'pg_catalog');

现在我可以用

读取一个大对象(所有这些,我不能流等)
select data from global_lo where loid = 1234

答案 1 :(得分:0)

如果您有权访问外部数据库,则可以在其上创建一个视图以将lob转换为byteatext,以便本地数据库可以使用它们

在外部数据库上,您将创建视图:

drop view if exists tmp_view_produto_descricao;

create view tmp_view_produto_descricao as
select * from (
    select dado.*, lo_get(dado.descricaoExtendida_oid) as descricaoEstendida
    from (
        select 
            itm.id as item_id, 
            case when itm.descricaoExtendida is Null then null else Cast(itm.descricaoExtendida as oid) end descricaoExtendida_oid
        from Item itm
        where itm.descricaoExtendida is Not Null
        and   Cast(itm.descricaoExtendida as Text) != ''
    ) dado
) dado
where Cast(descricaoEstendida as Text) != '';

在本地数据库上,您将声明外部视图,以便可以使用它:

create foreign table tmp_origem.tmp_view_produto_descricao (
    item_id bigint,
    descricaoExtendida_oid oid,
    descricaoEstendida bytea
) server tmp_origem options (schema_name 'public');

这有点麻烦和冗长,但与直接访问pg_largeobject相比,您会获得更好的性能。