В нашем репозитории SVN-кода я столкнулся с спецификацией пакета, которая после удаление нескольких строк - сводится к
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
, не ключевое слово, а переменная (package-). Это, похоже, не так, поскольку следующие компиляции одинаково хороши:
create or replace package tq84 as
return varchar2(10);
return number;
return date;
end tq84;
/
и, очевидно, компилятор должен сказать мне, что я объявляю одну и ту же переменную несколько раз.
EDIT 2: JOTN прав, конечно, и return
является переменной, и, кроме того,
компилятор не сообщает upfront, если переменная с тем же именем объявляется дважды или более, вместо этого это среда выполнения, которая делает.
Итак, имея в виду это, можно скомпилировать что-то вроде
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
допускается в качестве имени переменной, но потом, это спорно, если компилятор должен, по крайней мере, дать предупреждение, если переменная с тем же именем объявлен несколько раз.