如何循环遍历 Postgres 数据库中的表来为所有非系统表创建物化视图?

问题描述 投票:0回答:1

下面是我手动创建 mview 的代码,其中变量为 table_schema、table_name 和 [列列表]。

CREATE MATERIALIZED VIEW table_schema.table_name_bvw
AS
    WITH t0_ AS
        (SELECT [list of columns]
        FROM
            (SELECT  [list of columns] , Row_number() over (PARTITION BY objectid ORDER BY gdb_from_date DESC) rn_
            FROM     table_schema.table_name
            WHERE    (gdb_branch_id = 0)) a
WHERE rn_ = 1
AND gdb_is_delete = 0 )
    SELECT   [list of columns]
    FROM     t0_
WITH DATA;

CREATE UNIQUE INDEX IF NOT EXISTS table_name_bvw_uuid
    ON table_schema.table_name_bvw USING btree
    (globalid COLLATE pg_catalog."default" ASC NULLS LAST)
    TABLESPACE pg_default;

CREATE INDEX IF NOT EXISTS table_name_bvw_spat_idx
    ON table_schema.table_name_bvw USING gist
    (shape)
    TABLESPACE pg_default;
    
ALTER TABLE IF EXISTS table_schema.table_name_bvw
    OWNER TO owner;

我尝试创建一个循环,但不确定如何从数据库中提取 3 个变量。我应该从中创建一个表并循环遍历吗?

SELECT table_catalog, table_schema, table_name, array_to_string(array_agg(column_name order by columns.ordinal_position),',') column_name
FROM information_schema.columns  
WHERE table_schema <> 'pg_catalog'   AND table_name NOT LIKE 'i%'
  AND table_schema = 'fhl_dpw'
  group by table_catalog,table_schema,table_name
 ;

如果 mview 已经存在,我也希望它跳过。

postgresql loops esri materialized-views
1个回答
0
投票

好吧,我想通了!将参数从表传递到 Create 函数并循环遍历所有记录。效果很好。

    DO $$
DECLARE
    mviews CURSOR FOR
        SELECT tablebvw,column_name,tablen,bud,bspat FROM usa_master.fhltable;
    currentrow record;
BEGIN
    FOR currentrow in mviews
    LOOP
    EXECUTE
    'CREATE MATERIALIZED VIEW IF NOT EXISTS ' || currentrow.tablebvw || 
' AS
    WITH t0_ AS
        (SELECT  ' || currentrow.column_name || '
        FROM
            (SELECT ' || currentrow.column_name || ', Row_number() over (PARTITION BY objectid ORDER BY gdb_from_date DESC) rn_
            FROM ' || currentrow.tablen || '
            WHERE    (gdb_branch_id = 0)) a
WHERE rn_ = 1
AND gdb_is_delete = 0 )
    SELECT  ' || currentrow.column_name || '
    FROM     t0_
WITH DATA;

CREATE UNIQUE INDEX IF NOT EXISTS ' || currentrow.bud ||
    ' ON ' || currentrow.tablebvw ||' USING btree
    (globalid COLLATE pg_catalog."default" ASC NULLS LAST)
    TABLESPACE pg_default;

CREATE INDEX IF NOT EXISTS ' || currentrow.bspat || '
    ON ' || currentrow.tablebvw || ' USING gist
    (shape)
    TABLESPACE pg_default;
    
ALTER TABLE IF EXISTS ' || currentrow.tablebvw || '
    OWNER TO masterschema';
    END LOOP;
END$$;

技巧是使用 currentrow 作为变量源。

© www.soinside.com 2019 - 2024. All rights reserved.