Procedury nie są dozwolone w instrukcjach SQL, ponieważ mieszanie deklaratywnych i imperatywnych stylów programowania jest mylące.
Instrukcja SQL jest listą warunków — to Oracle decyduje, w jaki sposób wygenerować zestaw wyników zgodny z tymi warunkami. Procedura składowana PL/SQL to zestaw instrukcji, które zmieniają rzeczy w bardzo przewidywalny sposób.
W poniższym przykładzie ile razy należy pr
być straconym? Czy jest wykonywane przed czy po id = 1
? ? Gdyby instrukcje SQL miały predefiniowaną kolejność, optymalizator nie byłby w stanie wypychać predykatów, scalać podzapytań itp., a wydajność byłaby nie do zaakceptowania.
select *
from table1
where id = 1
and pr;
Nawet jeśli procedura została użyta w select
listy, to może nie mieć sensu. Na przykład select
lista wewnątrz exists
jest zawsze ignorowana.
select * from dual where exists (select pr from dual);
Ale w rzeczywistości instrukcje SQL czasami muszą wchodzić w interakcje ze światem zewnętrznym i potrzebna jest pewna logika proceduralna. Funkcje są dozwolone, ponieważ zazwyczaj po prostu oblicz coś i zwróć wartość. Funkcje zwykle nie zależą od stanu programu i mają wiele skutków ubocznych. Twoje funkcje mogą używaj zmiennych sesji, aktualizuj tabele (jeśli jest ustawione na PRAGMA AUTONOMOUS TRANSACTION
), ustawić kontekst itp. Oracle nie może powstrzymać Cię od robienia tych rzeczy, ale zabronienie procedur w instrukcjach SQL przynajmniej zniechęci do takiego kodu.