2009-12-18 28 views
7

Después de muchas búsquedas de Google y SO, no puedo encontrar una respuesta definitiva a esta simple pregunta:¿Cuál es la sintaxis para definir un procedimiento de Oracle dentro de otro procedimiento almacenado?

¿Cómo puedo definir un procedimiento dentro de otro procedimiento para usar?

Sé que hay bloques anidados y procedimientos anidados, pero no he visto la sintaxis exacta para lo que quiero. es decir

create or replace 
PROCEDURE TOP_PROCEDURE 
(...) 
IS 
-- nested procedure here? 
BEGIN 
    NULL; 
END; 
+1

La respuesta de Tony es perfecta, pero tengo que preguntar por qué querrías hacer esto. He visto procedimientos anidados usados, pero nunca los he visto usar bien. Es decir, casi siempre sería mejor colocar el procedimiento en un paquete (si aún no está en un paquete) y crear métodos privados en el paquete para los procedimientos anidados. De lo contrario, se vuelve bastante confuso seguir el código y conduce a la práctica bastante pobre de tener esencialmente todas las variables locales TOP_PROCEDURE como variables globales en el contexto de los procedimientos anidados. –

+1

Utilizo procedimientos anidados con bastante frecuencia, generalmente para funciones pequeñas que son muy específicas de su procedimiento principal (es decir, simplemente no tienen ningún sentido el hecho de que no puedan llamarlo), de lo contrario repetiría el mismo código más de una vez en el procedimiento principal. –

+0

Tu punto es definitivamente válido Justin, pero la verdad es que solo lo estoy usando de la manera que Jeffrey especifica. También fue realmente una pregunta por curiosidad también. Es una forma rápida de refactorizar mi código. – daveslab

Respuesta

15
create or replace 
PROCEDURE TOP_PROCEDURE 
(...) 
IS 
    variable NUMBER; 
    PROCEDURE nested_procedure (...) 
    IS 
    BEGIN 
    NULL; 
    END; 
    PROCEDURE another_nested_procedure (...) 
    IS 
    BEGIN 
    NULL; 
    END; 
BEGIN 
    NULL; 
END; 

procedimientos locales deben ser declarados después de (variables por ejemplo) else nada.

+0

Respuesta simple y rápida. Increíble. – daveslab

Cuestiones relacionadas