X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (neptune.hub.org [200.46.204.2]) by svr1.postgresql.org (Postfix) with ESMTP id B5D61D1B444 for ; Thu, 4 Dec 2003 18:37:29 +0000 (GMT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (neptune.hub.org [200.46.204.2]) (amavisd-new, port 10024) with ESMTP id 87925-10 for ; Thu, 4 Dec 2003 14:36:58 -0400 (AST) Received: from serwer.skawsoft.com.pl (skawina.eu.org [80.48.213.66]) by svr1.postgresql.org (Postfix) with ESMTP id 6E62ED1B49E for ; Thu, 4 Dec 2003 14:36:57 -0400 (AST) Received: from klaster.net (core-1.citynet.pl [80.48.135.69]) by serwer.skawsoft.com.pl (Postfix) with ESMTP id 5995C2B3CC; Thu, 4 Dec 2003 19:36:20 +0100 (CET) Message-ID: <3FCF7ECA.5060200@klaster.net> Date: Thu, 04 Dec 2003 19:36:58 +0100 From: Tomasz Myrta User-Agent: Mozilla/5.0 (Windows; U; Win 9x 4.90; pl-PL; rv:1.5) Gecko/20031007 X-Accept-Language: pl, en-us, en MIME-Version: 1.0 To: Jeff Kowalczyk Cc: pgsql-sql@postgresql.org Subject: Re: Trigger plpgsql function, how to test if OLD is set? References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200312/38 X-Sequence-Number: 16204 Dnia 2003-12-04 19:18, Użytkownik Jeff Kowalczyk napisał: > When this trigger runs on INSERT operations, the OLD variable is not > yet set, and the trigger function returns an error. > > Can anyone suggest a more sensible way to check for OLD before including > it in my expression, or another shortcut? Thanks. > > CREATE OR REPLACE FUNCTION orders_initordercharges () RETURNS "trigger" > AS ' > BEGIN > -- Check that no ordercharges exist for this orderid > IF (SELECT COUNT(orderchargeid) FROM ordercharges WHERE orderid=NEW.orderid OR orderid=OLD.orderid)=0 THEN > -- Insert standard initial set of ordercharges > INSERT INTO ordercharges (orderid, orderchargecode) VALUES (NEW.orderid,\'SALE\'); > INSERT INTO ordercharges (orderid, orderchargecode) VALUES (NEW.orderid,\'S&H\'); > END IF; > RETURN NEW; > END; > ' > LANGUAGE plpgsql; You can always check whether your trigger has been fired as insert or update trigger. DECLARE old_orderid integer; BEGIN if TG_OP=''UPDATE'' then old_orderid=OLD.orderid; else old_orderid=-1; end if; ... Regards, Tomasz Myrta