PL / SQL esegue l'ottimizzazione delle chiamate di coda?
-
22-07-2019 - |
Domanda
Sono abbastanza nuovo nella lingua e mi chiedevo se le chiamate di coda fossero ottimizzate. In un'altra lingua ho potuto esaminare il codice macchina o una rappresentazione intermedia e immaginarlo da solo, ma non ho idea di come farlo in PL / SQL.
Grazie in anticipo.
Soluzione
I documenti online suggeriscono di non:
http: // download -east.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#i2884
Ogni chiamata ricorsiva crea una nuova istanza di tutti gli articoli dichiarati in sottoprogramma, compresi i parametri, variabili, cursori ed eccezioni. Allo stesso modo, nuove istanze di SQL le dichiarazioni vengono create ad ogni livello nella discesa ricorsiva.
E
Almeno un percorso deve portare a a condizione di terminazione. Altrimenti, il la ricorsione andrebbe avanti fino a PL / SQL esaurisce la memoria e solleva il file eccezione predefinita STORAGE_ERROR.
Se l'ottimizzazione delle chiamate di coda fosse disponibile, non esaurirebbe l'archiviazione (anche se potrebbe lasciare un po 'di timeout se lo lasci funzionare troppo a lungo.)
Potresti essere in grado di vedere sperimentalmente cosa fa: scrivere una funzione ricorsiva che termina con una chiamata in coda a se stessa e osservare l'utilizzo della memoria del processo Oracle quando lo chiami o vedere quale messaggio di errore ricevi. Verifica se riesci a bloccarlo indefinitamente senza aumentare la memoria.