From: | Rastislav Hudak <hudak(dot)rastislav(at)gmail(dot)com> |
---|---|
To: | pgsql-general(at)postgresql(dot)org |
Subject: | recursive execute |
Date: | 2009-06-03 17:48:25 |
Message-ID: | 70c9648b0906031048i4e1e1acbu9cd88ff3c20435ca@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi,
I'd like to get an array containing distinct values (always integers) form a
column in a table that is provided as a parameter. So I created this
function:
CREATE OR REPLACE FUNCTION get_distinct_values(table_name text, param_name
text)
RETURNS integer[] AS
$BODY$
DECLARE
_values integer[];
rec record;
BEGIN
RAISE NOTICE 'table_name=% param_name=%', table_name, param_name;
DROP TABLE IF EXISTS z;
CREATE TEMP TABLE z(val integer);
FOR rec IN EXECUTE 'SELECT DISTINCT(' || param_name || ') AS z_val FROM ' ||
table_name || ';' LOOP
IF rec IS NOT NULL THEN
RAISE NOTICE 'rec=% ',rec;
INSERT INTO z(val) VALUES(CAST(rec.z_val AS integer)); -- same
result without the casting..
END IF;
END LOOP;
_values := ARRAY(SELECT val FROM z);
RETURN _values;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION get_distinct_values(text, text) OWNER TO "admin";
Because non of these approaches works:
i) EXECUTE 'ARRAY(SELECT...
i) ARRAY(EXECUTE 'SELECT...
i) EXECUTE 'SELECT .. INTO z '
i) EXECUTE 'SELECT .. ' INTO z
The function works, however if I call it from a recursive function foo, it
does not (only for the first time):
(at first call it works)
NOTICE: rec=(64)
CONTEXT: PL/pgSQL function "foo" line 45 at assignment
NOTICE: rec=(128)
CONTEXT: PL/pgSQL function "foo" line 45 at assignment
NOTICE: rec=(255)
CONTEXT: PL/pgSQL function "foo" line 45 at assignment
(when the function create_fp_sets is called recursively, it starts ok... )
NOTICE: rec=(75)
CONTEXT: PL/pgSQL function "foo" line 45 at assignment
PL/pgSQL function "foo" line 77 at EXECUTE statement
(but then...)
ERROR: type of "rec.z_val" does not match that when preparing the plan
CONTEXT: PL/pgSQL function "get_distinct_values" line 16 at SQL statement
PL/pgSQL function "foo" line 45 at assignment
PL/pgSQL function "foo" line 77 at EXECUTE statement
********** Error **********
ERROR: type of "rec.z_val" does not match that when preparing the plan
SQL state: 42804
Context: PL/pgSQL function "get_distinct_values" line 16 at SQL statement
PL/pgSQL function "foo" line 45 at assignment
PL/pgSQL function "foo" line 77 at EXECUTE statement
Any ideas why it does not work or how to get that array somehow?
Thanks!
From | Date | Subject | |
---|---|---|---|
Next Message | Louis Lam | 2009-06-03 17:54:57 | Re: catalog view use to find DATABASE, LANGUAGE, TABLESPACE, SCHEMA, SEQUENCE privileges granted to user or role |
Previous Message | Jennifer Trey | 2009-06-03 17:32:48 | Re: High I/O writes activity on disks causing images on browser to lag and not load |