Re: Why is this function wrong

From: "Thomas F(dot) O'Connell" <tfo(at)sitening(dot)com>
To: Johan Wehtje <joweht(at)tpgi(dot)com(dot)au>
Cc: pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: Why is this function wrong
Date: 2005-10-24 17:08:56
Message-ID: EF3FC174-AAF6-4F57-8B2E-467AC3E9B786@sitening.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general


On Oct 24, 2005, at 11:27 AM, Johan Wehtje wrote:

> This is probably obvious but I am not seeing what is going wrong
> with this function definition:
>
> CREATE OR REPLACE FUNCTION "public"."cproc_hli" (bgtemp NUMERIC,
> humidity NUMERIC, wspeed NUMERIC) RETURNS NUMERIC AS
> IF ($1 < 25)
> THEN
> SELECT (10.66 * (0.28 * $2)+(1.3 * $1) - $3)
> ELSE
> SELECT (8.62 * (0.38 * $2) + (1.55 * $1) - (0.5 * $3) + (exp(- $3 +
> 2.4)))
> END IF
> LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY
> INVOKER;
>
> ERROR: syntax error at or near "IF" at character 119
> LINE 2: IF ($1 < 25)
>
> I have tried with dollar quoting around the function body, changing
> the maguage to sql and using CASE ... WHEN instead of IF , tried
> Brackets and no brackets around the Boolean expression.. and a
> number of other variations, as well as rereading the Documentation.
>
> I have also tried not having aliases/names for the arguments.
>
> In every case I always get the syntax error directly after "AS".
>
> Can somebody point what is probably obvious.
>
> Cheers
> Johan Wehtje

This version will compile, but it won't do anything useful:

CREATE OR REPLACE FUNCTION "public"."cproc_hli" (bgtemp NUMERIC,
humidity NUMERIC, wspeed NUMERIC) RETURNS NUMERIC AS $$
BEGIN
IF (bgtemp < 25) THEN
PERFORM (10.66 * (0.28 * humidity)+(1.3 * bgtemp) - wspeed);
ELSE
PERFORM (8.62 * (0.38 * humidity) + (1.55 * bgtemp) - (0.5 * wspeed)
+ (exp(- wspeed + 2.4)));
END IF;
END;
$$ LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY
INVOKER;

You were missing some basic syntactic requirements, including a BEGIN/
END block, as well as several semicolons. You will also need to
SELECT into a variable if you want anything useful to happen with the
results. I've replaced your SELECTs with PERFORMs to recreate your
function as originally written.

I recommend a closer reading of the chapter on PL/pgSQL:

http://www.postgresql.org/docs/8.0/static/plpgsql.html

--
Thomas F. O'Connell
Co-Founder, Information Architect
Sitening, LLC

Open Source Solutions. Optimized Web Development.

http://www.sitening.com/
110 30th Avenue North, Suite 6
Nashville, TN 37203-6320
615-469-5150
615-469-5151 (fax)

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Michael Fuhr 2005-10-24 17:25:00 Re: pg_dump, MVCC and consistency
Previous Message shakahshakah@gmail.com 2005-10-24 17:00:57 Re: Why is this function wrong