Procedurer er ikke tilladt i SQL-sætninger, fordi det er forvirrende at blande deklarative og imperative programmeringsstile.
En SQL-sætning er en liste over betingelser - det er op til Oracle at beslutte, hvordan man producerer det resultatsæt, der matcher disse betingelser. En PL/SQL-lagret procedure er et sæt instruktioner, der ændrer tingene på en meget forudsigelig måde.
I eksemplet nedenfor, hvor mange gange skal pr
blive henrettet? Er det udført før eller efter id = 1
? Hvis SQL-sætninger havde en foruddefineret rækkefølge, ville optimeringsværktøjet ikke være i stand til at pushe prædikater, flette underforespørgsler osv., og ydeevnen ville være uacceptabel.
select *
from table1
where id = 1
and pr;
Selv hvis en procedure blev brugt i select
liste, giver det måske ikke mening. For eksempel, select
liste inde i en exists
ignoreres altid.
select * from dual where exists (select pr from dual);
Men i virkeligheden skal SQL-sætninger nogle gange interagere med omverdenen, og der er behov for en vis procedurelogik. Funktioner er tilladt, fordi de normalt bare beregne noget og returnere en værdi. Funktioner afhænger normalt ikke af programtilstanden og har en masse bivirkninger. Dine funktioner kunne brug sessionsvariabler, opdater tabeller (hvis det er sat til PRAGMA AUTONOMOUS TRANSACTION
), sæt en kontekst osv. Oracle kan ikke forhindre dig i at gøre disse ting, men at ikke tillade procedurer i SQL-sætninger vil i det mindste afskrække sådan kode.