2009-12-18 20 views
7

Dopo molte ricerche Google e SO, non riesco a trovare una risposta definitiva a questa semplice domanda:Qual è la sintassi per definire una procedura Oracle all'interno di un'altra procedura memorizzata?

Come si può definire una procedura all'interno di un'altra procedura da utilizzare?

So che esistono blocchi nidificati e procedure nidificate, ma non ho visto la sintassi esatta per quello che voglio. vale a dire

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

La risposta di Tony è azzeccata, ma devo chiederti perché vorresti farlo. Ho visto le procedure nidificate utilizzate, ma non le ho mai viste usate bene. Cioè, è quasi sempre meglio mettere la procedura in un pacchetto (se non è già in un pacchetto) e creare metodi privati ​​nel pacchetto per le procedure annidate. Altrimenti, diventa piuttosto confuso seguire il codice e porta alla pratica piuttosto scadente di avere essenzialmente tutte le variabili locali di TOP_PROCEDURE come variabili globali nel contesto delle procedure annidate. –

+1

Uso le procedure annidate abbastanza spesso - in genere per piccole funzioni che sono molto specifiche per la loro procedura genitore (cioè non hanno senso essere richiamabili da qualcos'altro), altrimenti dovrei ripetere lo stesso codice più di una volta nella procedura genitore. –

+0

Il punto è sicuramente Justin valido, ma in verità lo sto solo usando nel modo in cui specifica Jeffrey. Era anche davvero una domanda per curiosità. È un modo rapido per refactoring il mio codice. – daveslab

risposta

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; 

procedure locali devono essere dichiarati dopo qualsiasi altra cosa (per esempio le variabili).

+0

Risposta semplice e veloce. Eccezionale. – daveslab

Problemi correlati