pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
plpgsql dynamic record access
2+ messages / 2 participants
[nested] [flat]

* plpgsql dynamic record access
@ 2005-06-01 06:54 Ganesh <ganesh@volleyball.com>
  0 siblings, 0 replies; 2+ messages in thread

From: Ganesh @ 2005-06-01 06:54 UTC (permalink / raw)
  To: pgsql-sql

<html><body> <font style="font-family: arial,helvetica,sans-serif;" size="2">Hello,
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I have searched everywere&nbsp;
for a solution pls help me. I am building a trigger which would keep
track of every modification to some table. here i am generlising the
function. the following is the code in plpgsql.
<br>
&nbsp;<br>
&nbsp;<br>
--/* function for giving the field attributes of a given table */
<br>
CREATE FUNCTION get_fld_name(text) RETURNS _varchar AS '
<br>
DECLARE
<br>
&nbsp;&nbsp; out_fld text[20] := array[''name'',''no''];
<br>
&nbsp;<br>
BEGIN
<br>
&nbsp; RETURN out_fld;
<br>
END;
<br>
' LANGUAGE 'plpgsql';
<br>
&nbsp;<br>
--/** function for recording the changes&nbsp; **/
<br>
&nbsp;<br>
CREATE FUNCTION my_func_test() RETURNS OPAQUE AS '
<br>
DECLARE
<br>
&nbsp;<br>
&nbsp;flds text[20];
<br>
&nbsp;fldname text;
<br>
&nbsp;<br>
&nbsp;ofld text;
<br>
&nbsp;nfld text;
<br>
&nbsp;<br>
BEGIN
<br>
&nbsp;<br>
flds := (SELECT *&nbsp; from&nbsp; get_fld_name(TG_RELNAME));
<br>
&nbsp; IF TG_OP=''INSERT'' THEN
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ofld=nfld;
<br>
&nbsp; END IF;
<br>
&nbsp; FOR i IN 1..20 loop
<br>
&nbsp;&nbsp;&nbsp; IF flds[i] &lt;&gt; ''NULL'' THEN
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fldname := flds[i];
<br>
&nbsp;<br>
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">--/**************** Here is the problem ****************/
</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">&nbsp;</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ofld := OLD.fldname;&nbsp; -- this should return Old's value
</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nfld := NEW.fldname;&nbsp; -- this should return New's value
</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">&nbsp;</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">--/****I want to get he value from OLD.name or OLD.No *******/
</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">&nbsp;</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">--/***********************************************************
</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">&nbsp;</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">&nbsp;&nbsp;&nbsp;
Is there any way to concatnate the 2 Objects [(OLD) and (Fldname) ] so
that fldname would be converted to the value but the object OLD remains
same.
</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">&nbsp;</span><br style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">
<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 153);">***********************************************************/</span>
<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ofld := old_data[i];
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nfld := new_data[i];
<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp; INSERT INTO Audit_table values (5,TG_RELNAME,''now'',TG_OP,fldname,ofld,nfld,current_user);
<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAISE NOTICE ''ss : % '',fldname;
<br>
&nbsp;&nbsp; RAISE NOTICE ''ofldname : % '',ofld;
<br>
&nbsp;&nbsp; RAISE NOTICE ''nfldname : % '',nfld;
<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp; END IF;
<br>
&nbsp; END LOOP;
<br>
&nbsp;RETURN NEW;
<br>
END;
<br>
&nbsp; ' LANGUAGE 'plpgsql';
<br>
&nbsp;<br>
&nbsp;<br>
&nbsp;<br>
CREATE TRIGGER test_trig AFTER UPDATE ON test
<br>
FOR EACH ROW EXECUTE PROCEDURE my_func_test();
<br>
&nbsp;<br>
&nbsp;<br>
&nbsp;<br>
Please Help me..
<br>
&nbsp;<br>
Thanks ,<br>&nbsp;<br>R.Ganesh<br><br>mail to :&nbsp; ganesh@volleyball.com<br><br></font> <br>&nbsp;<br><hr>Get your FREE email @ http://Volleyball.Com  -  Get everything for volleyball @ http://Shop.Volleyball.Com  -  Post a message @ http://Forum.Volleyball.Com<br></body></html;



^ permalink  raw  reply  [nested|flat] 2+ messages in thread

* Re: plpgsql dynamic record access
@ 2005-06-08 17:20 Rajesh Kumar Mallah <mallah.rajesh@gmail.com>
  0 siblings, 0 replies; 2+ messages in thread

From: Rajesh Kumar Mallah @ 2005-06-08 17:20 UTC (permalink / raw)
  To: ganesh@volleyball.com; +Cc: pgsql-sql

Ganesh,

Did you have a look at example Example 35-2. A PL/pgSQL
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html

Regds
maLLAH



^ permalink  raw  reply  [nested|flat] 2+ messages in thread


end of thread, other threads:[~2005-06-08 17:20 UTC | newest]

Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2005-06-01 06:54 plpgsql dynamic record access Ganesh <ganesh@volleyball.com>
2005-06-08 17:20 Re: plpgsql dynamic record access Rajesh Kumar Mallah <mallah.rajesh@gmail.com>

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox