RE: plpgsql grief - Mailing list pgsql-sql

From Michael Ansley
Subject RE: plpgsql grief
Date
Msg-id 7F124BC48D56D411812500D0B747251480F3FC@FILESERVER002
Whole thread Raw
In response to plpgsql grief  (rob <rob@dsvr.net>)
Responses Re: plpgsql grief  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-sql
<p><font size="2">Hi, Rob,</font><p><font size="2">From the conversation taht Tom Lane got involved with earlier after
mylast posting on this toping I think that you need to change your first function to this:</font><p><font
size="2">createfunction testfunc (text) returns int4 as '</font><br /><font size="2">declare</font><br /><font
size="2"> sql varchar;</font><br /><font size="2">begin</font><br /><font size="2">  sql=''SELECT id AS res2 FROM
''||$1;</font><br /><font size="2">  execute sql ;</font><br /><font size="2">  return res2;</font><br /><font
size="2">end;</font><br/><font size="2">' language 'plpgsql' ;</font><p><font size="2">Please note the AS syntax rather
thanINTO.  This was a misconception on my part, which has obviously lasted longer than I'd hoped ;-)</font><p><font
size="2">createfunction update_trans (text, integer, text, text, text, text,</font><br /><font size="2">text) returns
booleanas '</font><br /><font size="2">declare</font><br /><font size="2">  sql varchar;</font><br /><font size="2"> 
tblalias for $1 ;</font><br /><font size="2">begin</font><br /><font size="2">  sql = ''insert into ''||$tbl||''(objid,
objtbl,et, event, time, reason,</font><br /><font size="2">owner) values (''||$2||'', ''||$3||'', ''||$4||'',
''||$5||'',now(), ''||$6||'', ''||$7||'')'';</font><br /><font size="2">  execute sql;</font><br /><font size="2"> 
return0;</font><br /><font size="2">end;</font><br /><font size="2">' language 'plpgsql' ;</font><br /><p><font
size="2">You'reforgetting that you have to unquote your variables, because you are constructing a string, and then
executingthat.  Using a varchar called SQL is a good habit for debugging.  It separates constructing the string from
executingthe query.</font><p><font size="2">Cheers...</font><br /><p><font size="2">MikeA</font><br /><br /><p><font
size="2">-----OriginalMessage-----</font><br /><font size="2">From: rob [<a
href="mailto:rob@dsvr.net">mailto:rob@dsvr.net</a>]</font><br/><font size="2">Sent: 08 February 2001 16:48</font><br
/><fontsize="2">To: pgsql-sql@postgresql.org</font><br /><font size="2">Subject: [SQL] plpgsql grief</font><br
/><p><fontsize="2">Hi, I'm having some real headache problems here. Apologies for the</font><br /><font
size="2">length,i just want to get it all out now :)</font><p><font size="2">I figured moving some 'simple' db code
frommy application to it's more</font><br /><font size="2">natural home in the db would work out. Bummer. Not only do i
haveto run</font><br /><font size="2">7.1 (beta 4) to be able to dynamically generate queries, I'm finding it</font><br
/><fontsize="2">*extrememly* difficult to get to get my simple functions to work (plus</font><br /><font size="2">for
the'widest used open source db' i'm finding examples very hard to</font><br /><font size="2">come by)</font><p><font
size="2">BeforeI start if anyone has any pointers to coding examples (and I mean</font><br /><font size="2">a little
morethan the standard postgres docs :) I'd be eternally</font><br /><font size="2">greatful. Failing that, can anyone
helpwith these two simple (ahem)</font><br /><font size="2">codelets :</font><p><font size="2">Example 1
:</font><p><fontsize="2">create function testfunc (text) returns int4 as '</font><br /><font size="2">declare</font><br
/><fontsize="2">  sql varchar;</font><br /><font size="2">  res int4;</font><br /><font size="2">begin</font><br
/><fontsize="2">  sql=''SELECT INTO res2 id FROM ''||$1 ;</font><br /><font size="2">  execute sql ;</font><br /><font
size="2"> return res;</font><br /><font size="2">end;</font><br /><font size="2">' language 'plpgsql' ;</font><p><font
size="2">simplefunction to return the id field of a table (passed to the</font><br /><font size="2">function). ok, not
areal world example, however i do this :</font><p><font size="2">#select testfunc('tablenam') ;</font><br /><font
size="2">andi get</font><br /><font size="2">ERROR:  parser: parse error at or near "into"</font><p><font size="2">ok
thisis actually first things last. I'm not really bothered about</font><br /><font size="2">returing values into local
variablesand then returning them, it's just</font><br /><font size="2">a run through. If I can't get this right, what
chancehave i got at</font><br /><font size="2">sorting out the real work i want to do. </font><p><font size="2">Example
2:</font><p><font size="2">create function update_trans (text, integer, text, text, text, text,</font><br /><font
size="2">text)returns boolean as '</font><br /><font size="2">declare</font><br /><font size="2">  tbl alias for $1
;</font><br/><font size="2">begin</font><br /><font size="2">  execute ''insert into tbl (objid, objtbl, et, event,
time,reason,</font><br /><font size="2">owner) values ($2, $3, $4, $5, now(), $6, $7)'';</font><br /><font size="2"> 
return0;</font><br /><font size="2">end;</font><br /><font size="2">' language 'plpgsql' ;</font><br /><p><font
size="2">#select update_trans('tablname','1' </font><br /><font
size="2">,'sometext','sometext','sometext','sometext','sometext');</font><br /><font size="2">ERROR:  Relation 'tbl'
doesnot exist</font><p><font size="2">dur. yeah i know it doesn't exist cause i want to pass it in parameter</font><br
/><fontsize="2">1.  Tried substituting tbl with $1 and quote_ident($1) and</font><br /><font size="2">quote_ident(tbl)
inthe sql string, but that didn't work either. (BTW</font><br /><font size="2">anyone know of any GUI interfaces that
support7.1 - phpPgAdmin 2.1,</font><br /><font size="2">2.2.1 and 2.3 seem to balk on functions)</font><p><font
size="2">Example2 is prelude to a larger function (not much larger - but then</font><br /><font size="2">this is
relavitveto how easy to code it is) to monitor the changes made</font><br /><font size="2">by a user, what they change
fromand to and who/when/why.... this is</font><br /><font size="2">already implemented in my app code - PHP - and
checkingout the features</font><br /><font size="2">available in postgres i figured i could do some kind of looping
through</font><br/><font size="2">the OLD and NEW dataset-array things, comparing them against each other,</font><br
/><fontsize="2">sorta like this :</font><p><font size="2">for ($i = 0 ; $i < count($NEW) ; $i++) {</font><br /><font
size="2">/*since $NEW and $OLD are essentially the same we can do this */</font><br /><font size="2">  if ($OLD[$i] !=
$NEW[$i])</font><br/><font size="2">    record the change bla bla bla</font><p><font size="2">}</font><br /><font
size="2">I'mreally hoping I can, as at this rate I've spent the better part of</font><br /><font size="2">three days
tryingto figure the simple things above out and the only</font><br /><font size="2">thing i'm about to reach is
breakingpoint...</font><p><font size="2">Sorry for the sarcasm, I'm about to pop.</font><p><font
size="2">Rob</font><code><fontsize="3"><br /><br />
**********************************************************************<br/> This email and any files transmitted with
itare confidential and<br /> intended solely for the use of the individual or entity to whom they<br /> are addressed.
Ifyou have received this email in error please notify<br /> Nick West - Global Infrastructure Manager.<br /><br /> This
footnotealso confirms that this email message has been swept by<br /> MIMEsweeper for the presence of computer
viruses.<br/><br /> www.mimesweeper.com<br /> **********************************************************************<br
/></font></code>

pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: view does not show all records it should
Next
From: "Ross J. Reedstrom"
Date:
Subject: Re: view does not show all records it should