Thread: plpgsql: Is ELSE IF supported or not?
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
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 > > 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 >
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
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 > -- > marko >
Pavel Stehule wrote: <blockquote cite="mid:162867790806260432o74515e8fwfc8958adccfce6e2@mail.gmail.com" type="cite"><prewrap="">2008/6/26 Marko Kreen <a class="moz-txt-link-rfc2396E" href="mailto:markokr@gmail.com"><markokr@gmail.com></a>:</pre><blockquote type="cite"><pre wrap=""> Although now that i read it more, the actual "form" is: ELSE IF THEN END IFEND 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. </pre></blockquote><pre wrap=""> this is same in all procedural languages </pre></blockquote><br /> I don't agree with this statement. In "all procedurallanguages", or probably most, they usually make "ELSE IF" special, in that you don't need to close the block twiceas 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 logicthat ELSE IF is valid? :-)<br /><br /> Now, if it were to say "an alternative form of ELSEIF is to nest IF statementlike so:" ...<br /><br /> Cheers,<br /> mark<br /><br /><pre class="moz-signature" cols="72">-- Mark Mielke <a class="moz-txt-link-rfc2396E" href="mailto:mark@mielke.cc"><mark@mielke.cc></a> </pre>
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