plpgsql dynamic queries and optional arguments

From: Curtis Scheer <Curtis(at)DAYCOS(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: plpgsql dynamic queries and optional arguments
Date: 2006-08-15 17:22:06
Message-ID: 031936836C46D611BB1B00508BE7345D049DB28A@gatekeeper.daycos.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

I have a table that I would like to be able to retrieve information out of
based on a combination of multiple columns and I would like to be able to do
this through a plpgsql stored procedure. Right now I have multiple stored
procedures that I am calling based on the values parameter values I pass
them and I am using static sql. The problem with this is it doesn't scale as
well as I would like it to because when I add another column of information
to the table that needs to be used for retrieval it adds another level of
combinations.

Also, when dealing with null values with static sql I use the same exact sql
statement except for the where clause containing the "column1 is null"
versus "column1 = passedvalue". Anyways, I have made a simple example
procedure and table; any help would be greatly appreciated basically I would
like to use dynamic sql instead of static but I have unsuccessfully been
able to retrieve the results of a dynamic sql statement in a pgplsql
procedure. Here is the example table and stored procedure.

CREATE TABLE public.foo

(

fooid int4 NOT NULL DEFAULT nextval('foo_fooid_seq'::regclass),

foo_date timestamp NOT NULL,

footypeid int4 NOT NULL,

footext varchar,

CONSTRAINT pk_fooid PRIMARY KEY (fooid)

)

WITHOUT OIDS;

ALTER TABLE public.foo OWNER TO fro;

CREATE OR REPLACE FUNCTION public.get_nextfoo(pfoo_date "timestamp",
pfoovalue int4, pfootext bpchar)

RETURNS SETOF public.foo AS

$BODY$DECLARE

rec foo%ROWTYPE;

BEGIN

if pfootext is null then

SELECT

*

INTO

rec

FROM

foo

WHERE

foo_date = pfoo_date

and foovalue = pfoovalue

and footext is null

For Update;

else

SELECT

*

INTO

rec

FROM

foo

WHERE

foo_date = pfoo_date

and foovalue = pfoovalue

and footext = pfootext

For Update;

end if;

RETURN NEXT rec;

return;

END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;

ALTER FUNCTION public.get_nextfoo(pfoo_date "timestamp", pfoovalue int4,
pfootext bpchar) OWNER TO fro;

insert into foo(foo_date,foovalue,footext) values('2006-08-15',1,'bar');

insert into foo(foo_date,foovalue,footext) values('2006-08-14',1,'bar');

insert into foo(foo_date,foovalue,footext) values('2006-08-15',2,'bar');

insert into foo(foo_date,foovalue,footext) values('2006-08-14',2,'bar');

insert into foo(foo_date,foovalue) values('2006-08-15',1);

insert into foo(foo_date,foovalue) values('2006-08-14',1);

insert into foo(foo_date,foovalue) values('2006-08-15',2);

insert into foo(foo_date,foovalue) values('2006-08-14',2);

Thanks,
Curtis

Browse pgsql-general by date

  From Date Subject
Next Message gustavo halperin 2006-08-15 17:39:07 REFERENCE problem with parent_table
Previous Message Jeff Davis 2006-08-15 17:07:23 Re: