Re: trouble using FOR ... IN EXECUTE query LOOPs in PL/pgSQL - Mailing list pgsql-sql

From Alex Pilosov
Subject Re: trouble using FOR ... IN EXECUTE query LOOPs in PL/pgSQL
Date
Msg-id Pine.BSO.4.10.10111061443420.11005-100000@spider.pilosoft.com
Whole thread Raw
In response to trouble using FOR ... IN EXECUTE query LOOPs in PL/pgSQL  ("Jon Obuchowski" <jon_obuchowski@terc.edu>)
List pgsql-sql
Your problem is trying to use arguments of the function inside something
that is EXECUTE'd. Try stuffing argument's values (NOT their names) inside
the SQL.

On Tue, 6 Nov 2001, Jon Obuchowski wrote:

> I've been playing around with PL/pgSQL, and in order to learn about using
> EXECUTE I decided to create a generic check constraint function for use in
> verifying foreign keys crossing inherited tables (yes, this will perform
> poorly vs. a hard-coded query, but it's intended for learning, not
> production).
> 
> Anyway, I keep encountering parsing errors within the EXECUTE query LOOP
> construct; my code follows:
> 
> DROP FUNCTION check_foreign_key ( varchar(32), varchar(32), integer );
> 
> CREATE FUNCTION check_foreign_key ( varchar(32), varchar(32), integer )
> RETURNS text AS '
>      DECLARE
>           table_name ALIAS FOR $1;
>           field_name ALIAS FOR $2;
>           field_value ALIAS FOR $3;
>           key_check_query TEXT;
>           check_count INTEGER;
>           field_value_exists BOOLEAN := ''f'';
> 
>      BEGIN
>           key_check_query :=
>           (
>           ''SELECT COUNT(*) AS check_count FROM ''
>                || quote_ident(table_name)
>                || '' WHERE ''
>                || quote_ident(field_name)
>                || '' = ''
>                || quote_literal(field_value)
>                || '';''
>           );
> 
>           FOR check_count IN EXECUTE key_check_query LOOP
>                IF check_count > 0 THEN
>                     field_value_exists := ''t'';
>                END IF;
>                EXIT;
>           END LOOP;
> 
>           RETURN field_value_exists;
>      END;
> ' LANGUAGE 'plpgsql';
> 
> this "compiles" OK upon creation, but when I try to execute it against a
> specific table and field...
> SELECT check_foreign_key ( 'test', 'test_id', 1);
> 
> I get the following parsing error:
> ERROR:  parser: parse error at or near "$1"
> 
> However, if I simplify the loop construct into a simple (and useless)
> EXECUTE, then the function compiles and returns A-OK...
> DROP FUNCTION check_foreign_key ( varchar(32), varchar(32), integer );
> 
> CREATE FUNCTION check_foreign_key ( varchar(32), varchar(32), integer )
> RETURNS text AS '
>      DECLARE
>           table_name ALIAS FOR $1;
>           field_name ALIAS FOR $2;
>           field_value ALIAS FOR $3;
>           key_check_query TEXT;
>           check_count INTEGER;
>           field_value_exists BOOLEAN := ''f'';
> 
>      BEGIN
>           key_check_query :=
>           (
>           ''SELECT COUNT(*) AS check_count FROM ''
>                || quote_ident(table_name)
>                || '' WHERE ''
>                || quote_ident(field_name)
>                || '' = ''
>                || quote_literal(field_value)
>                || '';''
>           );
> 
>           EXECUTE key_check_query;
> 
>           RETURN field_value_exists;
>      END;
> ' LANGUAGE 'plpgsql';
> 
> SELECT check_foreign_key ( 'test', 'test_id', 1);
> 
> check_foreign_key
> -----------------
> f
> (1 row)
> 
> ...so, I'm assuming that the issue lies with the FOR...IN EXECUTE LOOP, but
> I am simply failing to spot the issue.
> 
> I couldn't find any decent example of using EXECUTE in the archives (though
> my attempts were hobbled somewhat by the problems with the archive search
> feature), so I'd really appreciate any pointers for using EXECUTE within
> PL/pgSQL loops.
> 
> thanks,
> Jon Obuchowski
> 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
> 
> 




pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: Left join error
Next
From: Tom Lane
Date:
Subject: Re: trouble using FOR ... IN EXECUTE query LOOPs in PL/pgSQL