这是PL/SQL编译器中的错误吗?

Ren*_*ger 14 oracle plsql oracle10g

在我们的SVN代码库中,我遇到了一个包规范 - 在删除几行之后 - 归结为

create or replace package tq84 as
    return varchar2(10);
end tq84;
/
Run Code Online (Sandbox Code Playgroud)

在我看来,这样的规范并没有多大意义,因此根本不应该编译.但也许,我没有看到明显的,所以:这真的是一个错误吗?

为了完整起见:

me @ xxx.yyy.zz > select * from v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio
NLSRTL Version 10.2.0.4.0 - Production
Run Code Online (Sandbox Code Playgroud)

编辑:有人建议在上面给出的规范return中不是关键字而是(包 - )变量.然而,情况似乎并非如此,因为以下编译同样合适:

create or replace package tq84 as

    return varchar2(10);
    return number;
    return date;

end tq84;
/
Run Code Online (Sandbox Code Playgroud)

显然,编译器应该告诉我多次声明相同的变量.

编辑2:当然,JOTN是正确的,并且return 一个变量,而且,如果一个具有相同名称的变量被声明两次或更多,编译器就不会预先告诉,而是,它是运行时环境.

因此,考虑到这一点,可以编译类似的东西

create or replace package return as
  subtype return is varchar2(10);
end return;
/

create or replace package tq84 as

    constant constant 

    return . return := 'return';

    function function 

    return   return . return;

end tq84;
/
Run Code Online (Sandbox Code Playgroud)

看起来很奇怪,至少在第一眼看到.

那么,我想,这不是编译器错误,因为它 return被允许作为变量名,但是,如果编译器至少应该发出警告,如果多次声明具有相同名称的变量,那么它是有争议的.

JOT*_*OTN 9

显然,它允许您使用名称"return"作为变量.在那种情况下,它声明了一个包变量.我本以为会失败,因为它是一个关键字,但我尝试了它并且它有效.

试试这段代码:

create or replace package tq84 as 
  return varchar2(10); 
  somevar varchar2(5); 
  somevar varchar2(5); 
end tq84; 
/ 

set serveroutput on 
BEGIN 
  tq84.return:='Test'; 
  dbms_output.put_line(tq84.return); 
END; 
/ 
Run Code Online (Sandbox Code Playgroud)

这表示返回为变量,它允许多次声明另一个名称的相同变量.

现在,如果您尝试访问somevar,那么您会得到:

PLS-00371: at most one declaration for 'TQ84.SOMEVAR' is permitted 
Run Code Online (Sandbox Code Playgroud)

显然,由于某种原因,它会延迟检查.

我刚刚发现如何在编译时检测到这些问题.添加这个:

alter session set plsql_warnings = 'enable:all'; 
Run Code Online (Sandbox Code Playgroud)

上面的代码汇编了这些警告:

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
1/1      PLW-05018: unit TQ84 omitted optional AUTHID clause; default 
         value DEFINER used 

2/3      PLW-06010: keyword "RETURN" used as a defined name 
4/3      PLW-05001: previous use of 'SOMEVAR' (at line 3) conflicts with 
         this use 
Run Code Online (Sandbox Code Playgroud)