PL/pgSQLの使い方
PL/pgSQLについて質問させてください。
以下のような2つのテーブルAとBがあります。
テーブルA:
aid | fall0 | fall1
-----+-------+-------
001 | 0 | 0
002 | 0 | 0
テーブルB:
bid | aid | fall
--------+-----+------
000001 | 001 | 0
000002 | 001 | 0
000003 | 002 | 0
000004 | 002 | 0
テーブルAとテーブルBの関係は1:nの関係です。
以下のような2つのことがやりたいです。
テーブルAのfall0,fall1,テーブルBのfallはフラグです。
今、テーブルBのaid=001であるすべての行のfallを0から1に変えたとき、
それに対応するテーブルAの行のfall1が0から1にかわる。またテーブルBのaid=001である少なくとも一つの行のfallを0から1に変えたとき、
それに対応するテーブルAの行のfall0が0から1にかわるようなプログラムを作りたいのですが、なかなかうまくいきません。今aid=001のときをやりましたが、aidは任意のときを想定しています。もし、ご存知の方がいらっしゃいましたら教えていただけないでしょうか?
よろしくお願いいたします。以下は自分が書いたプログラムです。
drop table b;
drop table a;
create table A
(
aid text primary key,
fall0 integer,
fall1 integer
);
create table B
(
bid text primary key,
aid text not null references A(aid),
fall integer
);
insert into A values ('001',0,0);
insert into A values ('002',0,0);
insert into A values ('003',0,0);
insert into B values ('000001','001',0);
insert into B values ('000002','001',0);
insert into B values ('000003','002',0);
insert into B values ('000004','002',0);
/* 関数の定義 */
create function tri_test() returns trigger as '
begin
declare
aid_rec
if old.fall=0 and new.fall=1 then
update a set fall1=1 where a.aid = select b.aid from b where b.fall = 1);
end if;
return new;
end;
' language 'plpgsql';
/* トリガーの定義 */
create trigger tri_b after update or insert on b for each row
execute procedure tri_test();
/* B テーブルへのデータ操作 */
update b set fall=1 where aid='001';
お礼
みなさん、ありがとうございます!!! LEVELという意味が摑みにくかったのですが、 複数階という意味なのですね。 安心いたしました!