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

  • From: "Matthew Parker" <dimensional.dba@xxxxxxxxxxx>
  • To: <knecht.stefan@xxxxxxxxx>, "'oracle-l-freelists'" <oracle-l@xxxxxxxxxxxxx>
  • Date: Sat, 17 Mar 2018 01:44:21 -0700

From a Oracle SQL Reserved Word prospective you might think so but when you go 
to the documentation on Reserved Words, “loop” is not listed. 

 

https://docs.oracle.com/database/121/SQLRF/ap_keywd001.htm#SQLRF55621

 

Also in testing words it appears to error on the listed Reserved Words, but 
some other words that are also fundamental to SQL such as “merge” do not error 
either and are not in the key word list.

 

 

Matthew Parker

Chief Technologist

Dimensional DBA

Oracle Gold Partner

425-891-7934 (cell)

D&B 047931344

CAGE 7J5S7

Dimensional.dba@xxxxxxxxxxx <mailto:Dimensional.dba@xxxxxxxxxxx

 <http://www.linkedin.com/pub/matthew-parker/6/51b/944/> View Matthew Parker's 
profile on LinkedIn

www.dimensionaldba.com <http://www.dimensionaldba.com/

 

 

From: oracle-l-bounce@xxxxxxxxxxxxx <oracle-l-bounce@xxxxxxxxxxxxx> On Behalf 
Of Stefan Knecht
Sent: Friday, March 16, 2018 10:14 PM
To: oracle-l-freelists <oracle-l@xxxxxxxxxxxxx>
Subject: PL/SQL Interpreter oddity - bug or "expected"?

 

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 <http://zztat.net>  | Support our Indiegogo campaign at 
igg.me/at/zztat <http://igg.me/at/zztat>  | @zztat_oracle

Other related posts: