PL/SQL Interpreter oddity - bug or "expected"?

From: Stefan Knecht <knecht.stefan_at_gmail.com>
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

-- 

//
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
Received on Sat Mar 17 2018 - 06:13:30 CET

Original text of this message