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 <[email protected] <mailto:[email protected]>> 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
    [email protected]
    <mailto:[email protected]>
    http://postgis.refractions.net/mailman/listinfo/postgis-users




--
************************************
David William Bitner


_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users

------------------------------------------------------------------------

_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users
_______________________________________________
postgis-users mailing list
[email protected]
http://postgis.refractions.net/mailman/listinfo/postgis-users

Reply via email to