Re: [GENERAL] Newbie question about escaping in a function

2004-10-27 Thread Thomas F.O'Connell
Try using EXECUTE.
http://www.postgresql.org/docs/7.4/static/plpgsql- 
statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

-tfo
--
Thomas F. O'Connell
Co-Founder, Information Architect
Sitening, LLC
http://www.sitening.com/
110 30th Avenue North, Suite 6
Nashville, TN 37203-6320
615-260-0005
On Oct 26, 2004, at 11:57 AM, Naeem Bari wrote:
I have a simple function defined thusly:
 
CREATE OR REPLACE FUNCTION datemath(timestamp with time zone, int4,  
varchar)

  RETURNS timestamp AS
'
DECLARE
  tdat timestamp;
  rdat timestamp;
BEGIN
  IF ($1 IS NULL) THEN
    TDAT := NOW();
  ELSE
    TDAT := $1;
  END IF;
 
  select tdat + interval ''$2 $3'' into rdat;
  return rdat;
END;
'
  LANGUAGE 'plpgsql' VOLATILE;
 
The problem is the interval part. How do I tell the bugger to use the  
second and third params as input to interval? I have tried different  
ways of escaping, from \’$2 $3\’ to ‘’$2 $3’’ and everything else in  
between, it just doesn’t like it.

 
Help! J
 
Thanks,
naeem
---(end of broadcast)---
TIP 8: explain analyze is your friend


Re: [GENERAL] Newbie question about escaping in a function

2004-10-26 Thread Naeem Bari

Thanks! Now I get it...

naeem

-Original Message-
From: Oliver Elphick [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, October 26, 2004 3:05 PM
To: Naeem Bari
Cc: [EMAIL PROTECTED]
Subject: Re: [GENERAL] Newbie question about escaping in a function

On Tue, 2004-10-26 at 11:57 -0500, Naeem Bari wrote:
> I have a simple function defined thusly:
> 
>  
> 
> CREATE OR REPLACE FUNCTION datemath(timestamp with time zone, int4,
> varchar)
> 
>   RETURNS timestamp AS
> 
> '
> 
> DECLARE
> 
>   tdat timestamp;
> 
>   rdat timestamp;
> 
> BEGIN
> 
>   IF ($1 IS NULL) THEN
> 
> TDAT := NOW();
> 
>   ELSE
> 
> TDAT := $1;
> 
>   END IF;

It's neater to use the COALESCE() function, which is designed expressly
for this. 

>   select tdat + interval ''$2 $3'' into rdat;

In PL/pgSQL that should be "select into rdat ..."; but that won't work
in any case because you can't use passed parameters inside a string like
that.

>   return rdat;
> 
> END;
> 
> '
> 
>   LANGUAGE 'plpgsql' VOLATILE;
> 
>  
> 
> The problem is the interval part. How do I tell the bugger to use the
> second and third params as input to interval? I have tried different
> ways of escaping, from \'$2 $3\' to ''$2 $3'' and everything else in
> between, it just doesn't like it.

You have to construct a command string and use EXECUTE:

CREATE OR REPLACE FUNCTION datemath(timestamp with time zone, int4,
varchar)
   RETURNS timestamp AS
'DECLARE
  tdatTIMESTAMP;
  result  RECORD;
  cmd TEXT;
 BEGIN
  tdat := COALESCE($1, NOW());
  cmd := ''SELECT '' || quote_literal(tdat) ||
 ''::TIMESTAMP + INTERVAL '' ||
 quote_literal($2 || '' '' || $3) || '' AS x'';
  FOR result IN EXECUTE cmd LOOP
return result.x;
  END LOOP;
 END;
'
  LANGUAGE 'plpgsql' VOLATILE;

-- 
Oliver Elphick  [EMAIL PROTECTED]
Isle of Wight  http://www.lfix.co.uk/oliver
GPG: 1024D/A54310EA  92C8 39E7 280E 3631 3F0E  1EC0 5664 7A2F A543 10EA
 
 "Whosoever therefore shall be ashamed of me and of my 
  words in this adulterous and sinful generation; of him
  also shall the Son of man be ashamed, when he cometh 
  in the glory of his Father with the holy angels." 
 Mark 8:38 


---(end of broadcast)---
TIP 4: Don't 'kill -9' the postmaster


Re: [GENERAL] Newbie question about escaping in a function

2004-10-26 Thread Oliver Elphick
On Tue, 2004-10-26 at 11:57 -0500, Naeem Bari wrote:
> I have a simple function defined thusly:
> 
>  
> 
> CREATE OR REPLACE FUNCTION datemath(timestamp with time zone, int4,
> varchar)
> 
>   RETURNS timestamp AS
> 
> '
> 
> DECLARE
> 
>   tdat timestamp;
> 
>   rdat timestamp;
> 
> BEGIN
> 
>   IF ($1 IS NULL) THEN
> 
> TDAT := NOW();
> 
>   ELSE
> 
> TDAT := $1;
> 
>   END IF;

It's neater to use the COALESCE() function, which is designed expressly
for this. 

>   select tdat + interval ''$2 $3'' into rdat;

In PL/pgSQL that should be "select into rdat ..."; but that won't work
in any case because you can't use passed parameters inside a string like
that.

>   return rdat;
> 
> END;
> 
> '
> 
>   LANGUAGE 'plpgsql' VOLATILE;
> 
>  
> 
> The problem is the interval part. How do I tell the bugger to use the
> second and third params as input to interval? I have tried different
> ways of escaping, from \’$2 $3\’ to ‘’$2 $3’’ and everything else in
> between, it just doesn’t like it.

You have to construct a command string and use EXECUTE:

CREATE OR REPLACE FUNCTION datemath(timestamp with time zone, int4, varchar)
   RETURNS timestamp AS
'DECLARE
  tdatTIMESTAMP;
  result  RECORD;
  cmd TEXT;
 BEGIN
  tdat := COALESCE($1, NOW());
  cmd := ''SELECT '' || quote_literal(tdat) ||
 ''::TIMESTAMP + INTERVAL '' ||
 quote_literal($2 || '' '' || $3) || '' AS x'';
  FOR result IN EXECUTE cmd LOOP
return result.x;
  END LOOP;
 END;
'
  LANGUAGE 'plpgsql' VOLATILE;

-- 
Oliver Elphick  [EMAIL PROTECTED]
Isle of Wight  http://www.lfix.co.uk/oliver
GPG: 1024D/A54310EA  92C8 39E7 280E 3631 3F0E  1EC0 5664 7A2F A543 10EA
 
 "Whosoever therefore shall be ashamed of me and of my 
  words in this adulterous and sinful generation; of him
  also shall the Son of man be ashamed, when he cometh 
  in the glory of his Father with the holy angels." 
 Mark 8:38 


---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])


[GENERAL] Newbie question about escaping in a function

2004-10-26 Thread Naeem Bari








I have a simple function defined thusly:

 

CREATE OR REPLACE FUNCTION datemath(timestamp with time
zone, int4, varchar)

  RETURNS timestamp AS

'

DECLARE

  tdat timestamp;

  rdat timestamp;

BEGIN

  IF ($1 IS NULL) THEN

    TDAT
:= NOW();

  ELSE

    TDAT
:= $1;

  END IF;

 

  select
tdat + interval ''$2 $3'' into rdat;

  return
rdat;

END;

'

  LANGUAGE 'plpgsql' VOLATILE;

 

The problem is the interval part. How do I tell the bugger
to use the second and third params as input to interval?
I have tried different ways of escaping, from \’$2 $3\’ to ‘’$2
$3’’ and everything else in between, it just doesn’t like it.

 

Help! J

 

Thanks,

naeem