【发布时间】:2011-05-29 10:42:14
【问题描述】:
在我们的 SVN 代码存储库中,我遇到了一个包规范,它 -after 删除几行 - 归结为
create or replace package tq84 as
return varchar2(10);
end tq84;
/
在我看来,这样的规范没有多大意义,因此 根本不应该编译。但也许,我没有看到明显的,所以:这真的是一个错误吗?
为了完整起见:
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
编辑:有人建议在上面给出的规范中return 不是关键字,而是一个(包)变量。然而,情况似乎并非如此,因为以下编译同样可以:
create or replace package tq84 as
return varchar2(10);
return number;
return date;
end tq84;
/
很明显,编译器应该告诉我我多次声明了同一个变量。
EDIT 2:JOTN 是对的,当然,returnIS 是一个变量,此外,
编译器不会预先告知,如果一个同名的变量被声明了两次或更多次,而是运行时环境。
因此,考虑到这一点,可以编译类似的东西
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;
/
这看起来很奇怪,至少乍一看是这样。
那么,我想,这不是编译器错误因为 return 被允许作为变量名,但是编译器是否应该至少是有争议的如果同名变量被多次声明,则会发出警告。
【问题讨论】:
-
我刚刚添加了如何打开警告。
-
这不是一个错误......它是一个功能;)