selectした値をテーブル名にして動的にupdateする即時実行PL/pgSQL

あとで使うためのメモです。
DBメンテナンス作業時、流用できると思います。
PL/pgSQLの文法はPascal/Dephiと似ていますね...

/* テストテーブルを作成 */
drop table if exists hoge;
create table hoge(col1 varchar, col2 varchar);
insert into hoge (col1, col2) values ('a', '1');
insert into hoge (col1, col2) values ('a', '2');
insert into hoge (col1, col2) values ('a', '3');

select col2 from hoge where col1 = 'a';

drop table if exists foo1;
create table foo1(flg varchar);
insert into foo1 (flg) values ('1');
insert into foo1 (flg) values ('2');
insert into foo1 (flg) values ('3');
select * from foo1;

drop table if exists foo2;
create table foo2(flg varchar);
insert into foo2 (flg) values ('1');
insert into foo2 (flg) values ('2');
insert into foo2 (flg) values ('3');
select * from foo2;

drop table if exists foo3;
create table foo3(flg varchar);
insert into foo3 (flg) values ('1');
insert into foo3 (flg) values ('2');
insert into foo3 (flg) values ('3');
select * from foo3;

/* hoge.col2をテーブル名として、updateを行う即時実行PL/pgSQL。 */
do
$outer$
declare
    rec record;
    tbl text;
begin
    for rec in select col2 from hoge where col1 = 'a' order by 1
    loop
        tbl := 'foo' || rec.col2;
        raise info 'table name: %', tbl;
        execute 'update ' || tbl || ' set flg = ''0'' ' ;
    end loop;   
end;
$outer$;

/*
結果:
INFO:  table name: foo1
INFO:  table name: foo2
INFO:  table name: foo3
DO
*/