Maybe you can use a "LEFT OUTER JOIN" ...
CREATE or REPLACE FUNCTION "public"."tproc_handle_item_active"() RETURNS "pg_catalog"."trigger" AS $BODY$ DECLARE rec_item record; int_org_id integer; BEGIN -- whenever an item is set active; create entries in the following table: -- t_koaitem if new.item_active = true and old.item_active = false then select * into rec_item from t_item where item_id = new.item_id; int_org_id = rec_item.item_org_id; insert into t_koaitem (koai_koa_id, koai_item_id, koai_item_locked, koai_user_idm) SELECT t_koa.koa_id, t_item.item_id, false as lockstatus, t_item.item_user_idm FROM t_item INNER JOIN t_koa ON t_item.item_org_id = t_koa.koa_org_id LEFT OUTER JOIN t_koaitem ON (koaitem_koa_id = t_koa.koa_id AND koaitem_item_id = t_item.item_id) WHERE (((t_item.item_active)=True) AND ((t_koa.koa_koastatus_id)=2 Or (t_koa.koa_koastatus_id)=3) AND ((t_item.item_org_id)=int_org_id) AND (t_koaitem.koaitem_item_id IS NULL AND koaitem_item_id IS NULL) ); end if; return null; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; 2007/5/21, novnov <[EMAIL PROTECTED]>:
No and update would not be needed; but the capability would be close enough, I'd just skip the update, do nothing for that record. But from the sound of it, the example you're suggesting involves a loop or something of that order. I could have written this using a loop but thought a bulk operation that essentially worked like "insert new rows for the set and while doing so, silently skip inserts which would cause dupe key violations". I explained all of this in the earlier messages. I thought it might be more effenient to handle without a loop. I've been able to do this kind of thing with other databases; essentially instruct the routine to ignore errors silently, commit what it can commit. Raymond O'Donnell wrote: > > On 21/05/2007 05:26, novnov wrote: > >> OK, but, how do I set this up to do what I need? I want an insert that >> would >> create a dupe key to be rolled back, and inserts that would not create >> dupe >> keys to be committed. > > Do you specifically need it in a trigger? I seem to recall an example in > the docs for pl/pgsql demonstrating a function to do something like this > - I think it tries an INSERT, and when a duplicate key raises an > exception, it does an update instead. - You could easily adapt this to > your purposes. > > Ray. > > --------------------------------------------------------------- > Raymond O'Donnell, Director of Music, Galway Cathedral, Ireland > [EMAIL PROTECTED] > --------------------------------------------------------------- > > ---------------------------(end of broadcast)--------------------------- > TIP 2: Don't 'kill -9' the postmaster > > -- View this message in context: http://www.nabble.com/Trigger-function-which-inserts-into-table--values-from-lookup-tf3784731.html#a10720190 Sent from the PostgreSQL - general mailing list archive at Nabble.com. ---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org/
-- William Leite Araújo Analista de Banco de Dados - QualiConsult