2010-12-22 15 views
14

En nuestro SVN-repositorio de código, me encontré con una especificación de paquete que -después eliminar algunas líneas- se reduce a¿Es esto un error en el compilador PL/SQL?

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

Me parece que tal especificación no tiene mucho sentido y por lo tanto, no debe compilar en absoluto. Pero tal vez, no veo lo obvio, entonces: ¿es esto realmente un error?

Por completitud causa:

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 

Editar: se ha sugerido que en la especificación como dado anteriormente return no es la palabra clave, pero una variable (paquete-). Este no parece ser el caso, sin embargo, ya que el siguiente recoge igualmente bien:

create or replace package tq84 as 

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

end tq84; 
/

y claramente, el compilador me diga que declaro la misma variable varias veces.

EDIT 2: JOTN es cierto, por supuesto, y returnES una variable, y además, la compilador no le dice por adelantado, si una variable con el mismo nombre se declaró dos veces o más, en vez , es el entorno de tiempo de ejecución, que lo hace.

Entonces, con esto en mente, es posible compilar algo así como

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

que parece extraño, al menos a primera vista.

Así que, supongo, no es un error del compilador porquereturn se permite como un nombre de variable, pero luego, es discutible si el compilador debe al menos dar una advertencia si una variable con el mismo nombre es declarado varias veces

+0

Acabo de agregar cómo activar las advertencias. – JOTN

+3

No es un error ... es una característica;) – guigui42

Respuesta

9

Aparentemente, le permite usar el nombre "return" como variable. En ese caso, está declarando una variable de paquete. Me hubiera imaginado que fallaría porque es una palabra clave, pero lo intenté y funcionó.

probar este código:

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

que muestra el retorno como una variable y que permite que la misma variable de otro nombre para ser declarado más de una vez.

Ahora bien, si se intenta acceder a somevar, a continuación, se obtiene lo siguiente:

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

Así que al parecer retrasa el registro de entrada, por alguna razón.

Acabo de descubrir cómo se pueden detectar estos problemas en tiempo de compilación.Añadir lo siguiente:

alter session set plsql_warnings = 'enable:all'; 

que compila el código de seguridad de estas advertencias:

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 
3

sólo quería añadir una ilustración adicional de que la respuesta de JOTN es correcta. Parece malo que el compilador le permita declarar varias variables con el mismo nombre, pero tal vez esto sea un efecto secundario de cómo PL/SQL implementa la sobrecarga de métodos. En tiempo de ejecución, genera un error si el nombre ha sido declarado varias veces.

En una muestra como su ejemplo original, está claro que return se está utilizando como nombre de variable. Puede asignar y leer su valor como se muestra a continuación.

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 
Cuestiones relacionadas