Procedures zijn niet toegestaan in SQL-instructies omdat het verwarrend is om declaratieve en imperatieve programmeerstijlen te combineren.
Een SQL-instructie is een lijst met voorwaarden - het is aan Oracle om te beslissen hoe de resultatenset wordt geproduceerd die aan die voorwaarden voldoet. Een PL/SQL-opgeslagen procedure is een reeks instructies die dingen op een zeer voorspelbare manier veranderen.
In het onderstaande voorbeeld, hoe vaak moet pr
geëxecuteerd worden? Wordt het uitgevoerd voor of na id = 1
? Als SQL-instructies een vooraf gedefinieerde volgorde hadden, zou de optimizer niet in staat zijn om predikaten te pushen, subquery's samen te voegen, enz., en zouden de prestaties onaanvaardbaar zijn.
select *
from table1
where id = 1
and pr;
Zelfs als een procedure werd gebruikt in de select
lijst, is het misschien niet logisch. Bijvoorbeeld de select
lijst binnen een exists
wordt altijd genegeerd.
select * from dual where exists (select pr from dual);
Maar in werkelijkheid hebben SQL-statements soms interactie met de buitenwereld nodig en is enige procedurele logica nodig. Functies zijn toegestaan omdat ze meestal bereken gewoon iets en retourneer een waarde. Functies zijn normaal gesproken niet afhankelijk van de programmastatus en hebben veel bijwerkingen. Uw functies kunnen sessievariabelen gebruiken, tabellen bijwerken (als deze is ingesteld op PRAGMA AUTONOMOUS TRANSACTION
), een context instellen, enz. Oracle kan u er niet van weerhouden die dingen te doen, maar het weigeren van procedures in SQL-instructies zal dergelijke code in ieder geval ontmoedigen.