From: | "Shakil Shaikh" <sshaikh(at)hotmail(dot)com> |
---|---|
To: | <pgsql-general(at)postgresql(dot)org> |
Subject: | Array Parameters in EXECUTE |
Date: | 2009-06-11 09:12:22 |
Message-ID: | BAY117-DS66AFBC58534DAEC4FAC14AC420@phx.gbl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi,
Here's my general situation: I have a function which takes in an optional
ARRAY of Ids as so:
RETURN QUERY SELECT * FROM a WHERE a.id = ANY(v_ids) or v_ids is null;
However it seems that the ...or v_ids is null... bit forces a sequential
scan on a. Reading this list, it seems the best way to get over this is to
dynamically prepare a statement, perhaps something like this:
DECLARE
v_base text;
v_where text := '';
v_rec record;
BEGIN
v_base := 'SELECT * FROM a';
IF (v_ids IS NOT NULL) then
v_where := ' WHERE a.id = ANY(v_ids)';
END IF;
FOR v_rec IN EXECUTE v_base || v_where LOOP
RETURN NEXT v_rec;
END LOOP;
I picked up the looping returning trick next elsewhere in this list, and
presume that's the only way to handle dynamically returning a SET OF.
However the problem I'm having is with substituting in the ARRAY parameter
in to the WHERE string. Obviously the above doesn't quite work since the
named parameter v_ids isn't valid in the statement. I probably need some
kind of array_tostring function to write out the array explicitly, but I was
wondering if there was any other way to do this since the excessive
parameter processing could potentially defeat the purpose of using arrays in
the first place!
Thanks
Shak
From | Date | Subject | |
---|---|---|---|
Next Message | Pavel Stehule | 2009-06-11 09:47:52 | Re: Array Parameters in EXECUTE |
Previous Message | Sim Zacks | 2009-06-11 09:06:41 | sort by update |