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

前端之家收集整理的这篇文章主要介绍了oracle – 这是PL / SQL编译器中的错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我们的SVN代码存储库中,我遇到了一个包后缀
删除几行 – 归结到
create or replace package tq84 as
    return varchar2(10);
end tq84;
/

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

为了完成这个目的:

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不是关键字,而是一个(package-)变量.这似乎不是这样的,因为以下编译同样正常:

create or replace package tq84 as

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

end tq84;
/

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

编辑2:JOTN是对的,当然,返回是一个变量,而且
如果具有相同名称的变量被声明为两次或更多,则编译器不会提前告知,而是运行时环境.

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

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”作为变量.在这种情况下,它声明一个包变量.我会想到这会失败,因为它是一个关键字,但我尝试了它,它的工作.

尝试这段代码

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; 
/

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

现在,如果你尝试访问一些,那么你得到这个:

PLS-00371: at most one declaration for 'TQ84.SOMEVAR' is permitted

显然,由于某种原因延误了这种检查.

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

alter session set plsql_warnings = 'enable:all';

上面的代码编译这些警告:

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

猜你在找的Oracle相关文章