在我们的SVN-Code Repository中,我遇到了一个包规范 删除几行 - 归结为
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;
/
显然,编译器应该告诉我多次声明相同的变量。
编辑2 :JOTN当然是正确的,return
IS 是一个变量,而且,
如果一个具有相同名称的变量被声明两次或更多次,那么编译器就不会预先告诉它,而是运行时环境。
因此,考虑到这一点,可以编译类似
的内容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
被允许作为变量名,但是,如果编译器至少应该,则它是有争议的如果多次声明具有相同名称的变量,则发出警告。
答案 0 :(得分: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;
/
它将返回显示为变量,并允许多次声明另一个名称的相同变量。
现在,如果你试图访问somevar,那么你得到这个:
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
答案 1 :(得分:3)
只是想进一步说明JOTN的回答是正确的。编译器允许您使用相同的名称声明多个变量似乎很糟糕,但这可能是PL / SQL如何实现方法重载的副作用。在运行时,如果已多次声明名称,则会引发错误。
在类似原始示例的示例中,很明显return
被用作变量名称。您可以分配和读取其值,如下所示。
dev> set serveroutput on
dev> create or replace package test
2 as
3 return varchar2(10);
4 end test;
5 /
Package created.
dev> exec test.return := 'Hi!';
PL/SQL procedure successfully completed.
dev> exec dbms_output.put_line( test.return );
Hi!
PL/SQL procedure successfully completed.
dev> create or replace package test
2 as
3 return varchar2(10);
4 return varchar2(20);
5 end test;
6 /
Package created.
dev> exec test.return := 'Hi!';
BEGIN test.return := 'Hi!'; END;
*
ERROR at line 1:
ORA-06550: line 1, column 12:
PLS-00371: at most one declaration for 'TEST.RETURN' is permitted
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored