X-Original-To: pgsql-sql@postgresql.org Received: from localhost (postgresql.org [64.49.215.8]) by postgresql.org (Postfix) with ESMTP id 3DF62474E44 for ; Tue, 18 Feb 2003 03:51:22 -0500 (EST) Received: from fzkmail2.fzk.de (fzkmail2.fzk.de [141.52.27.52]) by postgresql.org (Postfix) with SMTP id 23288474E42 for ; Tue, 18 Feb 2003 03:51:21 -0500 (EST) Received: FROM resy5.fzk.de BY fzkmail2.fzk.de ; Tue Feb 18 09:48:46 2003 +0100 Received: œby rodos.fzk.de with ESMTP (8.8.6 (PHNE_17135)/8.7.1) id JAA28099; Tue, 18 Feb 2003 09:48:42 +0100 (MET) Message-ID: <3E51F36A.75F42D3@rodos.fzk.de> Date: Tue, 18 Feb 2003 09:48:42 +0100 From: Christoph Haller X-Mailer: Mozilla 4.77 [en] (X11; U; HP-UX B.10.20 9000/780) X-Accept-Language: en MIME-Version: 1.0 To: liongliong@telkom.net Cc: pgsql-sql@postgresql.org Subject: Re: trigger after with cursor Content-Type: text/plain; charset=iso-8859-2 Content-Transfer-Encoding: 7bit X-Virus-Scanned: by AMaViS new-20020517 X-Archive-Number: 200302/391 X-Sequence-Number: 11789 > > This problem can be handle using with rowtype, etc: > create or replace function fn_tr_ai_pdcblc() returns trigger as ' > declare > c_pdcblc cursor for select * from t_pdcblc where fc_branch=new.fc_branch > and fc_bankacct=new.fc_bankacct and fd_trxdate>=new.fd_trxdate; > row_pdcblc t_pdcblc%rowtype; > balance decimal(30,5); > ctr int; > begin > balance := 0; > ctr := 0; > open c_pdcblc; > for c_pdc in 1..(select count(*) from t_pdcblc where > fc_branch=new.fc_branch and fc_bankacct=new.fc_bankacct and > fd_trxdate>=new.fd_trxdate) loop > fetch c_pdcblc into row_pdcblc; > if (select count(*) from t_pdcblc where fc_branch=new.fc_branch and > fc_bankacct=new.fc_bankacct and fd_trxdate0 and ctr=0 then > ctr := ctr + 1; > select fm_balance into balance from t_pdcblc where > fc_branch=new.fc_branch and fc_bankacct=new.fc_bankacct > and > fd_trxdate=(select max(fd_trxdate) from t_pdcblc where > fc_branch=new.fc_branch and fc_bankacct=new.fc_bankacct and > fd_trxdate end if; > balance := balance+row_pdcblc.fm_masuk-row_pdcblc.fm_keluar; > row_pdcblc.fm_balance := balance; > update t_pdcblc set fm_balance=row_pdcblc.fm_balance where > fc_branch=row_pdcblc.fc_Branch and fc_bankacct=row_pdcblc.fc_bankacct and > fc_trxno=row_pdcblc.fc_trxno and fn_nomor=row_pdcblc.fn_nomor; > end loop; > close c_pdcblc; > return new; > end;' language 'plpgsql'; > > create trigger tr_ai_pdcblc after insert on d_transaksi.t_pdcblc for each > row execute procedure fn_tr_ai_pdcblc(); > Betty, It's really hard to read your codings because all is lowercase. > Now this problem trigger update for updated field in this table. And I do not understand what's the problem you are referring to in your 2nd mail. But, what came to my mind at once is: Why do you UPDATE explicitly? The documentation says: If a non-NULL value is returned then the operation proceeds with that row value. Note that returning a row value different from the original value of NEW alters the row that will be inserted or updated. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is possible to replace single values directly in NEW and return that, or to build a complete new record/row to return. Regards, Christoph