[postgis-users] plpgsql - problem using variable schema and table names

Kevin Neufeld kneufeld at refractions.net
Thu Dec 17 13:35:39 PST 2009


http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING

Try:

FOR target IN EXECUTE text_expression LOOP
    ...
END LOOP;



I usually do something like this:

DECLARE
   ...
   schemaname text := 'myschema';
   tablename text := 'mytable';
   sql text;
   r record;

BEGIN;
   sql := 'SELECT ... FROM ' || quote_ident(schemaname) || '.' || quote_ident(tablename);
   RAISE DEBUG '%s', sql;

   FOR r IN EXECUTE sql LOOP
     ...
   END LOOP
END;

-- Kevin

Birgit Laggner wrote:
> Yes, I have noticed that, but I don't know how to do that, especially at 
> defining my n (loop end point variable). I tried various versions (also 
> with execute), but without success.
> 
> Birgit.
> 
> On 17.12.2009 16:38, David William Bitner wrote:
>> Birgit,
>>
>> The problem may be that you are creating a varchar variable for your 
>> schema name and then you are trying to use it in an instance that is 
>> expecting a database object. Anytime you are trying to insert 
>> variables as database objects, you need to construct your query as a 
>> string and use execute similar as to how you are creating your insert 
>> statement.
>>
>> David
>>
>> On Thu, Dec 17, 2009 at 9:27 AM, Birgit Laggner 
>> <birgit.laggner at vti.bund.de <mailto:birgit.laggner at vti.bund.de>> wrote:
>>
>>     Dear list,
>>
>>     I am trying to generalize a pl/pgsql function I have written (see
>>     below). I would like to define schema and table names, as well as
>>     certain column names, in the function call (as in the PostGIS function
>>     AddGeometryColumn) in order to use them to define schema and table
>>     names
>>     and everything else within the function queries.
>>
>>     My problem is, that postgres doesn't recognize the defined variable
>>     names if I call them in a FROM clause or INSERT INTO.  This is the
>>     error
>>     message:
>>
>>     ERROR:  Schema »schemaname« does not exist
>>     LINE 1: SELECT  count( $1 ) from schemaname.table_a
>>                                     ^
>>     QUERY:  SELECT  count( $1 ) from schemaname.table_a
>>     CONTEXT:  PL/pgSQL function "_laggner_b_pgintersection" line 16 at
>>     assignment
>>
>>     I can't imagine that it should be impossible to use variable
>>     schema and
>>     table names in a plpgsql function. So, if anybody has suggestions, I
>>     would be quite happy.
>>
>>     Thanks and regards,
>>
>>     Birgit.
>>
>>     My PostGIS version: 1.4.0-10.1
>>     My PostgreSQL version: 8.4.1-2.1
>>
>>     My pl/pgsql function:
>>
>>     CREATE OR REPLACE  FUNCTION _laggner_b_pgintersection(schemaname
>>     varchar(20), table_a varchar(50), a_id varchar(20), table_b
>>     varchar(50),
>>     b_id varchar(20), intersection varchar(60)) RETURNS void AS
>>     $BODY$
>>
>>      DECLARE
>>      counter           integer;
>>      recordset_object  RECORD;
>>      i                 integer;
>>      n                 integer;
>>
>>      BEGIN
>>
>>      counter := 0;
>>      n := count(a_id) from schemaname.table_a;
>>
>>     --1. Intersection:
>>
>>      FOR i in 1..n LOOP
>>
>>      RAISE NOTICE 'Beginn Intersection Tabelle 1, Polygon %', i;
>>
>>      FOR recordset_object IN
>>
>>      SELECT
>>       a.a_id ,
>>       b.b_id,
>>       ST_intersection(a.the_geom, b.the_geom) AS the_geom
>>      FROM schemaname.table_a a, schemaname.table_b b
>>      WHERE a.a_id=i and
>>            st_intersects(a.the_geom, b.the_geom) and
>>            a.the_geom && b.the_geom
>>
>>      LOOP
>>
>>      execute
>>      'INSERT INTO ''||schemaname||''.''||intersection||'' (''||a_id||'',
>>     ''||b_id||'', the_geom) '||
>>       'VALUES ( '||
>>        ''||recordset_object||'.''||a_id||'', '||
>>        ''||recordset_object||'.''||b_id||'', '||
>>        ''||recordset_object||'.the_geom);';
>>     /*
>>     alternatively:
>>      INSERT INTO schemaname.intersection (a_id, b_id, the_geom)
>>       VALUES (
>>        recordset_object.a_id,
>>        recordset_object.b_id,
>>        recordset_object.the_geom);
>>     */
>>      counter := counter + 1;
>>
>>      RAISE NOTICE 'Schreibe Intersection-Polygon %', counter ;
>>
>>      END LOOP;
>>
>>      counter := 0;
>>
>>      END LOOP;
>>
>>      END;
>>     $BODY$
>>     LANGUAGE 'plpgsql' VOLATILE;
>>     ALTER FUNCTION _laggner_b_pgintersection(schemaname varchar(20),
>>     table_a
>>     varchar(50), a_id varchar(20), table_b varchar(50), b_id varchar(20),
>>     intersection varchar(60)) OWNER TO postgres;
>>
>>     _______________________________________________
>>     postgis-users mailing list
>>     postgis-users at postgis.refractions.net
>>     <mailto:postgis-users at postgis.refractions.net>
>>     http://postgis.refractions.net/mailman/listinfo/postgis-users
>>
>>
>>
>>
>> -- 
>> ************************************
>> David William Bitner
>>
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at postgis.refractions.net
>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>   
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users



More information about the postgis-users mailing list