PL/SQL Interpreter oddity - bug or "expected"?
Date: Sat, 17 Mar 2018 12:13:30 +0700
Message-ID: <CAP50yQ88Pv1oG4Dev7Xu0Wvgw1d8B3_nTJCzD5UwZn18Mg_pqw_at_mail.gmail.com>
Ran into this recently, and personally I feel that this should not compile. What do you guys think?
Simple case in point:
create or replace package foo as
procedure bar;
end;
/
Package created.
create or replace package body foo as
procedure bar
is
begin
begin
null;
end loop;
end;
end;
/
Package body created.
show errors
No errors.
SQL> exec foo.bar
PL/SQL procedure successfully completed.
What is happening is that Oracle interprets the "end loop" as being "end anonymous_block_name". And in my opinion, with a keyword like "loop" that should not be happening. In essence, the above is interpreted as:
create or replace package body foo as
procedure bar
is
begin
begin
null;
end anon_block_name;
end;
end;
/
If we switch the "end loop" to an "end if" (which is a similar flow control keyword) it reacts (in my opinion) correctly:
create or replace package body foo as
procedure bar
is
begin
begin
null;
end if;
end;
end;
/
Warning: Package Body created with compilation errors.
SQL> show errors
Errors for PACKAGE BODY FOO:
LINE/COL ERROR
-------- ----------------------------------------------------------------- 7/7 PLS-00103: Encountered the symbol "IF" when expecting one of the following: ; <an identifier> <a double-quoted delimited-identifier> The symbol "IF" was ignored.
SQL> Would you agree that that should not compile in the first place?
Stefan
--Received on Sat Mar 17 2018 - 06:13:30 CET
//
zztat - The Next-Gen Oracle Performance Monitoring and Reaction Framework! Visit us at zztat.net | Support our Indiegogo campaign at igg.me/at/zztat | _at_zztat_oracle -- http://www.freelists.org/webpage/oracle-l