Procedurer är inte tillåtna i SQL-satser eftersom det är förvirrande att blanda deklarativa och imperativa programmeringsstilar.
En SQL-sats är en lista med villkor - det är upp till Oracle att bestämma hur man ska producera resultatuppsättningen som matchar dessa villkor. En lagrad PL/SQL-procedur är en uppsättning instruktioner som ändrar saker på ett mycket förutsägbart sätt.
I exemplet nedan, hur många gånger ska pr
bli avrättad? Körs det före eller efter id = 1
? Om SQL-satser hade en fördefinierad ordning skulle optimeraren inte kunna pusha predikat, sammanfoga underfrågor, etc., och prestanda skulle vara oacceptabelt.
select *
from table1
where id = 1
and pr;
Även om en procedur användes i select
listan kanske det inte är vettigt. Till exempel, select
lista inuti en exists
ignoreras alltid.
select * from dual where exists (select pr from dual);
Men i verkligheten behöver SQL-satser ibland interagera med omvärlden, och viss procedurlogik behövs. Funktioner är tillåtna eftersom de vanligtvis bara beräkna något och returnera ett värde. Funktioner är normalt inte beroende av programtillståndet och har många biverkningar. Dina funktioner kunde använd sessionsvariabler, uppdatera tabeller (om den är inställd på PRAGMA AUTONOMOUS TRANSACTION
), ställ in ett sammanhang, etc. Oracle kan inte hindra dig från att göra dessa saker, men om du inte tillåter procedurer i SQL-satser kommer det åtminstone att motverka sådan kod.