Thread: dynamic function question

dynamic function question

From
"Chris Ochs"
Date:
I read the docs but I'm still a little lost as to how to do this.

I have this function which works fine.

CREATE OR REPLACE FUNCTION lookup_customer_byemail(varchar) RETURNS SETOF
customer_rec AS
'
DECLARE
   r RECORD;
   in_email ALIAS FOR $1;
BEGIN
   FOR r IN SELECT
s_oid,mer_id,site_id,order_id,pymt_type,pymt_subtype,comp_name,f_name1,l_nam
e1,f_name2,l_name2,address,city,state
,zipcode,phone,cust_email,country from customers where cust_email ILIKE
in_email LOOP
   RETURN NEXT r;
   END LOOP;
   RETURN;
END '
LANGUAGE 'plpgsql';


What I would like to do is pass in the column name that is being queried
against (cust_email) so it can be dynamic.   I tried the following but it
always returns an empty set.

CREATE OR REPLACE FUNCTION lookup_customer(varchar,varchar) RETURNS SETOF
customer_rec AS
'
DECLARE
   r RECORD;
   in_string ALIAS FOR $1;
   in_column ALIAS FOR $2;
BEGIN
   FOR r IN SELECT
s_oid,mer_id,site_id,order_id,pymt_type,pymt_subtype,comp_name,f_name1,l_nam
e1,f_name2,l_name2,address,city,state
,zipcode,phone,cust_email,country from customers where in_column ILIKE
in_string LOOP
   RETURN NEXT r;
   END LOOP;
   RETURN;
END '
LANGUAGE 'plpgsql';


Re: dynamic function question

From
Stephan Szabo
Date:
On Fri, 4 Jun 2004, Chris Ochs wrote:

> What I would like to do is pass in the column name that is being queried
> against (cust_email) so it can be dynamic.   I tried the following but it
> always returns an empty set.
>
> CREATE OR REPLACE FUNCTION lookup_customer(varchar,varchar) RETURNS SETOF
> customer_rec AS
> '
> DECLARE
>    r RECORD;
>    in_string ALIAS FOR $1;
>    in_column ALIAS FOR $2;
> BEGIN
>    FOR r IN SELECT
> s_oid,mer_id,site_id,order_id,pymt_type,pymt_subtype,comp_name,f_name1,l_nam
> e1,f_name2,l_name2,address,city,state
> ,zipcode,phone,cust_email,country from customers where in_column ILIKE
> in_string LOOP

I think you're going to need to look at using FOR IN EXECUTE to do this
generating a query string, something like:

FOR r IN EXECUTE ''SELECT s_oid,mer_id,site_id,order_id,pymt_type,
pymt_subtype,comp_name,f_name1,l_name1,f_name2,l_name2,address,
city,state,zipcode,phone,cust_email,country from customers
where '' || in_column || '' ILIKE '' || in_string
LOOP

Re: dynamic function question

From
"Chris Ochs"
Date:
Yes that works, thanks for the tip.

Chris
----- Original Message -----
From: "Stephan Szabo" <sszabo@megazone.bigpanda.com>
To: "Chris Ochs" <chris@paymentonline.com>
Cc: <pgsql-general@postgresql.org>
Sent: Friday, June 04, 2004 3:06 PM
Subject: Re: [GENERAL] dynamic function question


> On Fri, 4 Jun 2004, Chris Ochs wrote:
>
> > What I would like to do is pass in the column name that is being queried
> > against (cust_email) so it can be dynamic.   I tried the following but
it
> > always returns an empty set.
> >
> > CREATE OR REPLACE FUNCTION lookup_customer(varchar,varchar) RETURNS
SETOF
> > customer_rec AS
> > '
> > DECLARE
> >    r RECORD;
> >    in_string ALIAS FOR $1;
> >    in_column ALIAS FOR $2;
> > BEGIN
> >    FOR r IN SELECT
> >
s_oid,mer_id,site_id,order_id,pymt_type,pymt_subtype,comp_name,f_name1,l_nam
> > e1,f_name2,l_name2,address,city,state
> > ,zipcode,phone,cust_email,country from customers where in_column ILIKE
> > in_string LOOP
>
> I think you're going to need to look at using FOR IN EXECUTE to do this
> generating a query string, something like:
>
> FOR r IN EXECUTE ''SELECT s_oid,mer_id,site_id,order_id,pymt_type,
> pymt_subtype,comp_name,f_name1,l_name1,f_name2,l_name2,address,
> city,state,zipcode,phone,cust_email,country from customers
> where '' || in_column || '' ILIKE '' || in_string
> LOOP
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>