V příkazech SQL nejsou povoleny procedury, protože míchání deklarativních a imperativních programovacích stylů je matoucí.
Příkaz SQL je seznam podmínek – je na společnosti Oracle, aby rozhodla, jak vytvořit sadu výsledků, která těmto podmínkám odpovídá. Uložená procedura PL/SQL je sada instrukcí, které mění věci velmi předvídatelným způsobem.
V níže uvedeném příkladu, kolikrát by měl pr
být popraven? Je proveden před nebo po id = 1
? Pokud by příkazy SQL měly předem definované pořadí, pak by optimalizátor nebyl schopen předávat predikáty, slučovat poddotazy atd. a výkon by byl nepřijatelný.
select *
from table1
where id = 1
and pr;
I když byla procedura použita v select
seznam, nemusí to dávat smysl. Například select
seznam uvnitř exists
je vždy ignorováno.
select * from dual where exists (select pr from dual);
Ale ve skutečnosti SQL příkazy někdy potřebují interagovat s vnějším světem a je potřeba určitá procedurální logika. Funkce jsou povoleny, protože obvykle stačí něco vypočítat a vrátit hodnotu. Funkce obvykle nezávisí na stavu programu a mají mnoho vedlejších účinků. Vaše funkce mohly použít proměnné relace, aktualizovat tabulky (pokud je nastaveno na PRAGMA AUTONOMOUS TRANSACTION
), nastavte kontext atd. Oracle vám v těchto věcech nemůže zabránit, ale nepovolení procedur v příkazech SQL takový kód přinejmenším odradí.