代码之家  ›  专栏  ›  技术社区  ›  pm100

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

  •  2
  • pm100  · 技术社区  · 8 年前

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   pm100    8 年前

    我想出了怎么做。也可以通过pg_large object表访问大型对象存储。所以我做到了

    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
    
        2
  •  0
  •   Haroldo_OK    7 年前

    如果您有权访问外部数据库,可以在其上创建一个视图来转换 lob bytea text 所以它们可以被本地数据库使用。

    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 直接的。

    推荐文章