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,其中包含 ViewId
和 ViewName
。
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
。
我有一个包含 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,其中包含 ViewId
和 ViewName
。
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
。