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

Reply via email to