Re: executing dynamic commands

From: "codeWarrior" <gpatnude(at)hotmail(dot)com>
To: pgsql-sql(at)postgresql(dot)org
Subject: Re: executing dynamic commands
Date: 2006-02-07 15:53:33
Message-ID: dsafoe$2ouf$1@news.hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

In your function why not create a temporary table then use that for your
processing ?

CREATE TEMPRORARY TABLE tabledest AS (SELECT * FROM tblsrc WHERE condition);

<christian(dot)michels(at)eifelgeist(dot)com> wrote in message
news:15802822(dot)125111138807576371(dot)JavaMail(dot)servlet(at)kundenserver(dot)(dot)(dot)
> Hi,
>
> I user PostgreSQl 8.0.4 on Win2003 Server and write a function to copy
> rows from one table into another table with the same column definition.
> My first approach was to use something like:
>
> query_value := 'INSERT INTO ' || tabledest || ' SELECT * FROM ' ||
> tablesrc;
> EXECUTE query_value;
>
> This only works if the column definition AND the order between source and
> destination is the same !
> In my case I have always the same column definitions but they are not in
> the same order between source and destination table.
> What I tryed then is to loop through the column definition of the source
> and query the sourcetable for the value. For that I have to execut a query
> with dynamic tablename and dynamic columname to generate two stings one
> with the columndefinitin and one with the columnvalues to exececute
> something like: INSERT INTO tabelfoo (columndefinitinstring) VALUES
> (columnvaluesstring)
>
> see snip of function:
>
> fieldvalues RECORD;
> output RECORD;
> insertvalues VARCHAR;
> fieldname VARCHAR;
>
>
> -- Get Attribute List from Table and write it to output
> -- Read Values of Fieldname from source
> query_value := 'select * from ' || tablesrc ;
>
> FOR fieldvalues IN EXECUTE query_value LOOP
>
> FOR output IN SELECT a.attnum,
> a.attname AS field,
> FROM
> pg_class c, pg_attribute a, pg_type t
> WHERE
> c.relname = tablesrc AND
> a.attnum > 0 AND
> a.attrelid = c.oid AND
> a.atttypid = t.oid
> ORDER BY a.attnum LOOP
>
> -- Read Field Name from Out Table
> fieldname := output.field;
>
> -- Write Field Name into Variable
> IF insertcolumns IS NULL THEN
> insertcolumns := fieldname;
> ELSE
> insertcolumns := insertcolumns || ',' || fieldname;
> END IF;
>
> Until here everyting is fine ... but now I try to query the value from
> RECORD fieldvalues with the columname fieldname variable from the inner
> loop !
> I tryed the following ...
>
> query_value := 'select quote_ident(' || fieldvalues || ').quote_literal('
> || fieldname ||')';
>
> EXECUTE query_value;
>
>
> and I get the following error message ...
>
> ERROR: could not find array type for data type record
> CONTEXT: SQL statement "SELECT 'select quote_ident(' || $1 ||
> ').quote_literal(' || $2 ||')'"
> PL/pgSQL function "prx_db__appendtable" line 87 at assignment
>
>
> END LOOP;
>
> END LOOP;
>
> I know the function is not runnable, but my question is how can I
> dynamically combine "fieldvalues"."fieldname" to read the values column by
> colum out if a RECORD variable to generate the "columnvaluesstring"
> mentioned above ?!
> Maybe this approach is to complicated and there is a quick and easy
> solution ?!
>
> Any help is very much appreciated !!
>
> Thanx a lot & Regards
>
> Chris
>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
> choose an index scan if your joining column's datatypes do not
> match
>

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message george young 2006-02-07 17:01:10 trecherous subselect needs warning?
Previous Message Richard Huxton 2006-02-07 15:49:31 Re: Filtering data based on timestamp