Re: plpgsql grief - Mailing list pgsql-sql

From rob
Subject Re: plpgsql grief
Date
Msg-id 3A84258B.438BB16D@dsvr.net
Whole thread Raw
In response to Re: plpgsql grief  (Ian Harding <iharding@pakrat.com>)
List pgsql-sql
<snip>
> 
> I feel your pain;^)
> 
> Here is the text of a post from Tuesday... I think it answers your question
> which is that you cannot do variable subsititution for table or field names
> inside procedures.  This is not a Postgres specific limitation, MS SQL
> Server has the same issue.
> 
> > >>>>> "DR" == David Richter
> >  writes:
<snip>
Ya know, i already read this one. That's what got me on to 7.1 and using
EXECUTE :)

ARgh! Apparenty I've opened up a real can of worms with wanting cool
general functions, with a bit of dynamism and business logic.
However....

OK dumped pl/pgsql, thinking pl/tcl is more my bag (didn't fancy
recompiling perl to get the shared lib, and didn't want to waste much
time struggling to somehow see if PHP could be used, since PHP is my
current 'main' lang). Pl/tcl supports dynamic queries - great !. However
it introduced it's own little wrinkles. Now for starters I've no
knowledge of tcl, however doing my job means learning loads of
exteranous crap, and what another lang... I reckon I can do it, just
need a little help. So here goes.

found out some things too - trigger functions must return opaque (ok not
100% on what opaque is, but I'm not worrying about that just yet), also
can't have parameters in the function name - odd, but this lead on to -
how the hell would you pass the parameters to the func anyway if it's
attached to a trigger - like INSERT - and you merely type the SQL :
 insert into tablename values bla blabla ;

and invoke the trigger, which inturn invokes the function ... erm there
- wheres the transport to passing the parameters (sorry i know my
programmers lingo isn't 100%).

here's my tcl'ed function, which i attached to my main table on INSERT.
It's supposed to log the action to another table passed to it - the idea
is i've generalised some logging tables to various 'main' tables, and
these functions are supposed to record various db and system level
events. The function represents a bit of copying and playing - duno what
TPL is however it works. I'll address further issues, error checking,
processing etc when I've got it actually doing something :

create function update_trans () returns opaque as ' spi_exec -array TPL "insert into $1 (objid, objtbl, et, event,
time,
reason, owner) values (\'$2\', \'$3\', \'$4\', \'$5\', now(), \'$6\',
\'$7\')"
' language 'pltcl' ;

which works !! well, gets invoked however it doesn't know what 'text'
is. Not sure where that got picked up from, but it obviously didn't work
- however the insert did. Now I found out there's a parameter array
tgargs or something, but how does this get set ? How does it then get
accessed in the function ?

OK, being the resourceful chap I am (relatively) how about this, a
slight diversion. Why not just make up some function which do the main
insert, business logic, event logging stuff explicity and sack off doing
sql inserts/update etcs.

(can't return opaque here, but that's no bother, i think (hope))

New function

create function update_trans (text, int4, text, text, text, text, text)
returns boolean as ' spi_exec -array TPL "insert into $1 (objid, objtbl, et, event, time,
reason, owner) values (\'$2\', \'$3\', \'$4\', \'$5\', now(), \'$6\',
\'$7\')" return1
' language 'pltcl' ;

then call these from my code like

select update_trans (bla, 1, bla, bla blabl) ;

which works also. I get to pass all the parameters i want, and have full
control over execution. OK this looses part of the reason for doing this
in the first place - tracking people who side track the app code by
modifying the db directly, however since noone should be doing that
anyway, no problem. (note should). 

Again apologies for the verbose message - i feel the 'fuller picture' is
more useful in the long run, rather than diconnected questions. Well it
is to me when I'm on your side of the fence.

Thanks for the reply BTW. Oh, and why is this news group only accessible
during late afternoon from 3pm'ish GMT. I'm access it from the UK. All
morning, for two days, I couldn't get on - server busy errors.

Oh and before I forget - over several months of news group postings
there has been the recognision of the need for examples for us newies,
and some mention of people compiling various docs for just such a
purpose - anyone get anywhere with any of these, as they were several
months ago. I'm certainly gaining some real gotcha type info on all of
this :)

Now I've had it. Burned out. So off to the pub and henceforth become as
drunk as a skunk !

Regards

Rob


pgsql-sql by date:

Previous
From: Alex Pilosov
Date:
Subject: Re: [GENERAL] Re: Query never returns ...
Next
From: Najm Hashmi
Date:
Subject: Wierd postgres Problem