plpgsql: Is ELSE IF supported or not?

Started by Marko Kreenover 17 years ago6 messages
#1Marko Kreen
markokr@gmail.com

Docs seems to say it is, but following function fails to compile:

create function err_else() returns void as $$
begin
if 1 = 1 then
else if 1 = 2 then
end if;
end;
$$ language plpgsql;

ERROR: syntax error at or near ";"
LINE 6: end;

Version 8.3.3.

--
marko

#2Pavel Stehule
pavel.stehule@gmail.com
In reply to: Marko Kreen (#1)
Re: plpgsql: Is ELSE IF supported or not?

hello

2008/6/26 Marko Kreen <markokr@gmail.com>:

Docs seems to say it is, but following function fails to compile:

create function err_else() returns void as $$
begin
if 1 = 1 then
else if 1 = 2 then
end if;
end;
$$ language plpgsql;

ERROR: syntax error at or near ";"
LINE 6: end;

use elseif or elsif :)

Pavel

Show quoted text

Version 8.3.3.

--
marko

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Marko Kreen
markokr@gmail.com
In reply to: Pavel Stehule (#2)
Re: plpgsql: Is ELSE IF supported or not?

On 6/26/08, Pavel Stehule <pavel.stehule@gmail.com> wrote:

2008/6/26 Marko Kreen <markokr@gmail.com>:

Docs seems to say it is, but following function fails to compile:

create function err_else() returns void as $$
begin
if 1 = 1 then
else if 1 = 2 then
end if;
end;
$$ language plpgsql;

ERROR: syntax error at or near ";"
LINE 6: end;

use elseif or elsif :)

Yeah, I know. Just the docs say this is one "form" of the IF statement:

IF ... THEN ... ELSE IF

Although now that i read it more, the actual "form" is:

ELSE
IF THEN
END IF
END IF;

That is - the ELSE starts new block unconditionally and ignores any IF
that follows. Later the IF can be part of new block as usual. Huh.

This is confusing. I suggest removing the "ELSE IF" as one of the "forms"
because it is not.

--
marko

#4Pavel Stehule
pavel.stehule@gmail.com
In reply to: Marko Kreen (#3)
Re: plpgsql: Is ELSE IF supported or not?

2008/6/26 Marko Kreen <markokr@gmail.com>:

On 6/26/08, Pavel Stehule <pavel.stehule@gmail.com> wrote:

2008/6/26 Marko Kreen <markokr@gmail.com>:

Docs seems to say it is, but following function fails to compile:

create function err_else() returns void as $$
begin
if 1 = 1 then
else if 1 = 2 then
end if;
end;
$$ language plpgsql;

ERROR: syntax error at or near ";"
LINE 6: end;

use elseif or elsif :)

Yeah, I know. Just the docs say this is one "form" of the IF statement:

IF ... THEN ... ELSE IF

Although now that i read it more, the actual "form" is:

ELSE
IF THEN
END IF
END IF;

That is - the ELSE starts new block unconditionally and ignores any IF
that follows. Later the IF can be part of new block as usual. Huh.

This is confusing. I suggest removing the "ELSE IF" as one of the "forms"
because it is not.

this is same in all procedural languages

Pavel

Show quoted text

--
marko

#5Mark Mielke
mark@mark.mielke.cc
In reply to: Pavel Stehule (#4)
Re: plpgsql: Is ELSE IF supported or not?

Pavel Stehule wrote:

2008/6/26 Marko Kreen <markokr@gmail.com>:

Although now that i read it more, the actual "form" is:

ELSE
IF THEN
END IF
END IF;

That is - the ELSE starts new block unconditionally and ignores any IF
that follows. Later the IF can be part of new block as usual. Huh.

This is confusing. I suggest removing the "ELSE IF" as one of the "forms"
because it is not.

this is same in all procedural languages

I don't agree with this statement. In "all procedural languages", or
probably most, they usually make "ELSE IF" special, in that you don't
need to close the block twice as per above. The ELSE IF is not actually
special in PL/SQL, so it is not a special form. The "ELSE" can contain a
block, which contain any statement, including a nested IF statement. Why
not describe ELSE WHILE as well based upon the logic that ELSE IF is
valid? :-)

Now, if it were to say "an alternative form of ELSEIF is to nest IF
statement like so:" ...

Cheers,
mark

--
Mark Mielke <mark@mielke.cc>

#6Tom Lane
tgl@sss.pgh.pa.us
In reply to: Mark Mielke (#5)
Re: plpgsql: Is ELSE IF supported or not?

Mark Mielke <mark@mark.mielke.cc> writes:

I don't agree with this statement. In "all procedural languages", or
probably most, they usually make "ELSE IF" special, in that you don't
need to close the block twice as per above. The ELSE IF is not actually
special in PL/SQL, so it is not a special form. The "ELSE" can contain a
block, which contain any statement, including a nested IF statement. Why
not describe ELSE WHILE as well based upon the logic that ELSE IF is
valid? :-)

Now, if it were to say "an alternative form of ELSEIF is to nest IF
statement like so:" ...

Yeah, that might be better. I think the reason the text looks the way
it does is that we didn't have ELSEIF/ELSIF to start out with, and what
is now section 38.6.2.3 was originally an example of what you had to do
to work around that lack. I agree that the current presentation is more
confusing than anything else. ISTM documenting ELSEIF and ELSIF as
"separate forms" of IF is a bit over-the-top too.

regards, tom lane