PostgreSQL 9.3:更新视图中包含的表

PostgreSQL 9.3: Update tables contained in a view

我有一个包含 3 个 table 的视图。我想更新视图中包含的每个 table。

Tables:

Table 1: 测试 1

create table test1
(
id int,
name text,
city text
);

insert into test1 values(1,'Abc','xyz');

Table 2: 测试2

create table test2
(
id int,
name text,
city text
);

insert into test2 values(1,'bc','xz');

Table3: 测试3

create table test3
(
id int,
name text,
city text
);

insert into test3 values(1,'Ac','yz');

查看:

create view myview as select * from test1 union all select * from test2 union all select * from test3;     

注意:我有一种情况需要一次更新所有tables个城市。所以我写了一个函数 它对单个 table.

进行更新
create or replace function updatefun(tablename text)

returns void as

$body$

Declare
    query varchar;
Begin
    query := 'Update '||tablename||'
         set city = ''XXX''';

    raise info '%',query;

    execute query;
end;

$body$

Language plpgsql;

我有另一个 table,其中包含 ViewIdViewName

create table viewdetails
(
ViewId int,
ViewName text
);

insert into viewdetails values(101,'myview');

现在我想写另一个函数从视图中获取所有 tables 并想调用 函数 updatefun 从这个函数更新所有 tables.

我的尝试:

create or replace function fun1(vId int)

returns void as

$body$

declare
    query varchar;
    rec1 record;
    rec2 record;
    
begin
    DROP TABLE IF EXISTS temp_table1;

    create temp table temp_table1(viewNames text);

    query := 'insert into temp_table1 select ViewName from ViewDetails where ViewId = '|| vId ||'';

    execute query;

    for rec1 in select ViewNames from temp_table1 loop

        for rec2 in SELECT Table_Name FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE  WHERE View_Name = 'rec1' loop

            select updatefun('rec2');

        end loop;

    end loop;
end;

$body$

language plpgsql;

调用函数:

select fun1(101);

检查视图:

select * from myview;

不明白为什么没有更新??

这是不正确的:

select updatefun('rec2');

你想要

perform updatefun(rec2);

rec2 周围没有任何引号,否则它被解释为文字,而不是变量的名称。

另外 rec2 应该是 TEXT 类型,而不是 RECORD