Oracle
 sql >> Database >  >> RDS >> Oracle

Perché non possiamo eseguire la stored procedure nell'istruzione select in Oracle? c'è un motivo forte?

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.