Re: Why is this function wrong
От | Thomas F. O'Connell |
---|---|
Тема | Re: Why is this function wrong |
Дата | |
Msg-id | EF3FC174-AAF6-4F57-8B2E-467AC3E9B786@sitening.com обсуждение исходный текст |
Ответ на | Why is this function wrong (Johan Wehtje <joweht@tpgi.com.au>) |
Ответы |
Re: Why is this function wrong
|
Список | 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)
В списке pgsql-general по дате отправления: