Re: plpgsql Question.. - Mailing list pgsql-sql

From Rajesh Kumar Mallah
Subject Re: plpgsql Question..
Date
Msg-id Pine.LNX.4.33.0304282030530.645-100000@localhost.localdomain
Whole thread Raw
In response to Re: plpgsql Question..  (Rod Taylor <rbt@rbt.ca>)
List pgsql-sql
On 28 Apr 2003, Rod Taylor wrote:

> Why select at all?  Just update them both with the below?
> 
> UPDATE desttable SET <field> = coalesce(<field>, (SELECT <field> FROM
> sourcetable)), <field2> = coalesce(<field2>, (SELECT <field2> FROM
> sourcetable));



Hey i dont want to depend on the current list of feilds in the
table rite now. In that case i will have to keep updating
the function when the table structure is altered.

so i wanted to depend on the catalogs for getting list of
feilds.

is my thinking correct ?

regds
mallah.


> 
> This will update field to be the old value of field, if one existed, or
> the value from the sourcetable if it was null.
> 
> If speed is an issue, look into an UPDATE with the FROM clause to do a
> join rather than several sub-selects.
> 
> 
> Build the above query by passing the function a list of fields via
> get_columns() as used below.
> 
> On Mon, 2003-04-28 at 09:31, Rajesh Kumar Mallah wrote:
> > Hi,
> > 
> > I wanted to "merge" two records in a table
> > having lots of feilds i dont want to modify
> > the procedure every time a add a new record.
> > 
> > so i pass the function two primary keys to be
> > merged (source,dest) , the function 
> > 
> > 
> > 1. shud iterate the list of feilds in that tables . 
> > 2. For each feild compare the two values in the rows and pick the not 
> >    null one from either of the two.
> > 
> > 3. update dest row with the not null values derieved from source if
> >    dest were null.
> > 
> > 
> > 
> > the following is my unsuccessful attempt to this 
> > requirement.
> > 
> > 
> > 
> > CREATE OR REPLACE  FUNCTION general.merge_profiles (integer,integer) RETURNS text AS '
> > 
> > DECLARE
> >         source alias for $1;
> >         dest   alias for $2;
> >         source_record RECORD;
> >         dest_record RECORD;
> >         r  RECORD;
> >         upd_stmt text;
> > 
> > 
> > BEGIN
> > 
> >         SELECT INTO source_record * from general.profile_master where profile_id=source;
> > 
> >         IF NOT FOUND THEN
> >                 RAISE EXCEPTION '' profile % not found '' , source;
> >         END IF;
> > 
> >         SELECT INTO dest_record   * from general.profile_master where profile_id=dest;
> > 
> >         IF NOT FOUND THEN
> >                 RAISE EXCEPTION '' profile % not found '' , dest;
> >         END IF;
> > 
> >         upd_stmt := '' UPDATE profile_master SET '' ;
> > 
> >         FOR r IN SELECT get_columns as colname from utils.get_columns(''profile_master'' , ''general'') 
> >               where get_columns not in (''profile_id'')  LOOP
> >                 upd_stmt := upd_stmt || r.colname ||
> >                 ''= COALESCE (source_record.'' || r.colname || '', dest_record.'' || r.colname || '') , '' ;
> > 
> >         END LOOP ;
> > 
> >         upd_stmt := rtrim (upd_stmt , '', '');
> > 
> >         upd_stmt := upd_stmt || '' WHERE profile_id = '' || dest || '';'' ;
> > 
> >         -- PERFORM upd_stmt;
> >         RAISE INFO ''%'' , upd_stmt;
> > 
> >         RETURN ''OK'';
> > END;
> > 
> > ' LANGUAGE 'plpgsql' ;
> > 
> > 
> > 
> > 
> > On Monday 28 Apr 2003 6:30 pm, you wrote:
> > > On Mon, 2003-04-28 at 08:12, Rajesh Kumar Mallah wrote:
> > > > is it possible to access a feild in a RECORD type
> > > > variable where the feild name is variable.
> > > >
> > > > eg say r is a record having feild name , email , salary
> > > >
> > > > r.name is 'foo'
> > > > r.email is 'bar@foo.com'
> > > > r.salary is 1000
> > > >
> > > > suppose  feild_name iterates via a FOR LOOP
> > > > through values (name , email , salary)
> > > >
> > > > is it possible to access that feild in record r
> > > > inside the loop ?
> > >
> > > Not that I'm aware of.  What you can do it build the query to SELECT
> > > <variable> FROM table.
> > >
> > > Another alternative is to switch languages. A perl, tcl, etc. based
> > > function would be capable of doing what you want.
> 



pgsql-sql by date:

Previous
From: Rajesh Kumar Mallah
Date:
Subject: Re: replace function
Next
From: vikas baid
Date:
Subject: differences between oracle,pgsql,sybase