Le procedure non sono consentite nelle istruzioni SQL perché la combinazione di stili di programmazione dichiarativo e imperativo crea confusione.
Un'istruzione SQL è un elenco di condizioni:spetta a Oracle decidere come produrre il set di risultati che soddisfa tali condizioni. Una stored procedure PL/SQL è un insieme di istruzioni che cambiano le cose in un modo molto prevedibile.
Nell'esempio seguente, quante volte dovrebbe pr
essere eseguito? Viene eseguito prima o dopo id = 1
? Se le istruzioni SQL avessero un ordine predefinito, l'ottimizzatore non sarebbe in grado di inviare predicati, unire sottoquery e così via e le prestazioni sarebbero inaccettabili.
select *
from table1
where id = 1
and pr;
Anche se è stata utilizzata una procedura nel select
elenco, potrebbe non avere senso. Ad esempio, il select
elenco all'interno di un exists
viene sempre ignorato.
select * from dual where exists (select pr from dual);
Ma in realtà le istruzioni SQL a volte devono interagire con il mondo esterno ed è necessaria una logica procedurale. Le funzioni sono consentite perché solitamente basta calcolare qualcosa e restituire un valore. Le funzioni normalmente non dipendono dallo stato del programma e hanno molti effetti collaterali. Le tue funzioni potrebbero usa le variabili di sessione, aggiorna le tabelle (se è impostato su PRAGMA AUTONOMOUS TRANSACTION
), imposta un contesto, ecc. Oracle non può impedirti di fare queste cose, ma non consentire procedure nelle istruzioni SQL scoraggerà almeno tale codice.