【问题标题】:Execute Result of Dynamic Postgres Query动态 Postgres 查询的执行结果
【发布时间】:2020-11-19 07:54:42
【问题描述】:

我的 postgres 数据库中有一个名为 rpt.view_refresh_schedule 的表。此表包含存储在我的数据库中的具体化视图的名称,我想按计划刷新。

我已经编写了下面的查询,它获取 rpt.view_refresh_schedule 表中的每条记录并构建一个动态查询来刷新每个表。

select CONCAT('REFRESH MATERIALIZED VIEW ' || view_name || ';') as script from rpt.view_refresh_schedule

该查询的输出如下:

REFRESH MATERIALIZED VIEW mv_user_trading_activity;
REFRESH MATERIALIZED VIEW mv_orders;

我想创建一个函数来执行由上述 sql 生成的动态查询。我怎样才能做到这一点?我看过其他从单个字符串执行查询的帖子,但这是多个命令。在 python 中,我会遍历结果并执行每一个。 postgres中有类似的东西吗?我尝试了 LOOP 功能,但没有成功。

【问题讨论】:

    标签: sql postgresql dynamic-sql materialized-views


    【解决方案1】:

    除非您的刷新计划是真正动态的,这意味着您为给定的物化视图更新您的表,您通常不需要函数或表。如果刷新间隔稳定,对于给定的 MV,您可以在createalter 物化视图上定义它。从文档部分 create_mv_refresh on create:

    使用 create_mv_refresh 子句指定默认方法, 数据库刷新物化视图的模式和时间。如果 物化视图的主表被修改,然后数据 在物化视图中必须更新以使物化视图 准确反映其主表中当前的数据。这 子句让您安排时间并指定方法和模式 刷新物化视图的数据库。

    【讨论】:

      【解决方案2】:

      如果你使用的是 psql,你可以这样做,而无需编写函数:

      select CONCAT('REFRESH MATERIALIZED VIEW ' || view_name || ';') as script from rpt.view_refresh_schedule
      \gexec
      

      【讨论】:

        【解决方案3】:

        请试一试:

        DO $$
        DECLARE 
          cmd text;
        BEGIN
          FOR cmd in select CONCAT('REFRESH MATERIALIZED VIEW ' || view_name) as script 
                       from rpt.view_refresh_schedule 
          LOOP
            EXECUTE cmd;
          END LOOP;
        END;
        $$;
        

        【讨论】:

          猜你喜欢
          • 2012-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-14
          • 1970-01-01
          • 1970-01-01
          • 2021-10-09
          相关资源
          最近更新 更多