Re: triggers: dynamic references to fields in NEW and OLD?
От | Klint Gore |
---|---|
Тема | Re: triggers: dynamic references to fields in NEW and OLD? |
Дата | |
Msg-id | 4830C78F.70007@une.edu.au обсуждение исходный текст |
Ответ на | Re: triggers: dynamic references to fields in NEW and OLD? ("Kerri Reno" <kreno@yumaed.org>) |
Список | pgsql-general |
[see below] Kerri Reno wrote: > Vance, > > I missed your earlier post, so I may be misunderstanding the > situation, but I think you could do this more easily in plpython, > because TD['new'] and TD['old'] are dictionaries, and you can traverse > the dictionaries like this: > > for k, v in TD['new'].items(): > if tblfld == k: > plpy.notice('%s' % v) > > This probably looks like gibberish if you're not used to python, but > if you'd like more help, email me back (with your original post) and > I'll get back to you next week. > > Kerri > > On 5/15/08, *Vance Maverick* <vmaverick@pgpeng.com > <mailto:vmaverick@pgpeng.com>> wrote: > > Thanks! Your solution clearly works, but it requires the shared > function to > enumerate all possible column names. In my real case, there are 8-10 > distinct names, so that's a bit ugly....but it works. > > Vance > > -----Original Message----- > If you just need which table triggered the function then > |TG_TABLE_NAME| may > be simpler than passing parameters. > > Something like this will probably work for you (replace the raise > notice > with whatever you have to do) > > create or replace function atest() returns trigger as $$ declare > avalue int; > tblfld text; > begin > tblfld := tg_argv[0]; > if tblfld = 'aa' then > avalue := new.aa; > else > if tblfld = 'bb' then > avalue := new.bb <http://new.bb>; > end if; > end if; > raise notice '%',avalue; > return new; > end; > $$ language plpgsql; > > klint. > Agree with Kerri - do it in one of the languages other than plpgsql. Plpgsql can't do the for loop as simply as other languages. There's no way to walk a record structure (new) as a collection/array and pull out the item you are interested in. You could possibly cheat by putting new into a temp table and then executing a select on it. Performance will probably be bad. create temp table newblah as select new.*; execute 'select new. ' || tg_argv[0] || '::text' || ' from newblah new ' into newval; execute 'drop table newblah'; There probably is a function in the plpgsql internals that will pull a named field out of a record but I have no idea what it is or if it's exposed so that it can be called. Maybe someone who knows about the internals of plpgsql could comment - is there a function like getfieldfromrecord(record,text)? klint. -- Klint Gore Database Manager Sheep CRC A.G.B.U. University of New England Armidale NSW 2350 Ph: 02 6773 3789 Fax: 02 6773 3266 EMail: kgore4@une.edu.au
В списке pgsql-general по дате отправления: