簡體   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