2010-06-09 13 views
5

Tengo un bloque anónimo pl/sql con un procedimiento declarado dentro de él, así como un cursor. Si declaro el procedimiento antes del cursor, falla. ¿Existe un requisito de que los cursores sean declarados antes de los procedimientos?Orden de declaración en un bloque anónimo pl/sql

¿Qué otras reglas existen para el orden de declaración en un bloque pl/sql?

Esto funciona:

DECLARE 
cursor cur is select 1 from dual; 
procedure foo as begin null; end foo; 
BEGIN 
null; 
END; 

Esta falla con el error PLS-00103: Encountered the symbol "CURSOR" when expecting one of the following: begin function package pragma procedure form

DECLARE 
procedure foo as begin null; end foo; 
cursor cur is select 1 from dual; 
BEGIN 
null; 
END; 

Respuesta

12

cursores, variables, constantes y tipos deben ser declaradas antes de paquetes/funciones.

Ésta fallaría también:

DECLARE 
procedure foo as begin null; end foo; 
x VARCHAR2(10); 
BEGIN 
null; 
END; 
+2

La documentación de referencia es aquí http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/block.htm#i32791 No está muy claro, pero las "declaraciones de elementos" (por ejemplo, variables) están en la lista 1 y tiene que venir antes de "definiciones de procedimiento/función" wh Están en la lista 2. –

+0

@Gary: ¡Excelente, gracias! –

0

Si desea declarar un cursor que está disponible para el procedimiento sub así, sólo tiene que añadir otro bloque anónimo:

DECLARE 
cursor cur is select 1 from dual; 
BEGIN 
DECLARE 
    procedure foo as begin null; end foo; 
BEGIN 
    null; 
END; 
END; 
Cuestiones relacionadas