繁体   English   中英

动态 Postgres 查询的执行结果

[英]Execute Result of Dynamic Postgres Query

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

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

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

该查询的output如下:

REFRESH MATERIALIZED VIEW mv_user_trading_activity;
REFRESH MATERIALIZED VIEW mv_orders;

我想创建一个 function 来执行由上述 sql 生成的动态查询。我该怎么做? 我看过其他帖子从单个字符串执行查询,但这是多个命令。 在 python 中,我将循环遍历结果并执行每个结果。 postgres中有类似的东西吗? 我试过 LOOP function 但没有成功。

如果您使用的是 psql,则可以这样做,而不必编写 function:

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

请试一试:

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;
$$;

除非您的刷新计划是真正动态的,这意味着您经常为给定的物化视图更新表,否则您既不需要 function 也不需要表。 如果刷新间隔稳定,对于给定的 MV,您可以在创建更改物化视图时定义它。 从文档部分 create_mv_refresh on create:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM