Процедурите не са разрешени в SQL изрази, тъй като смесването на декларативни и императивни стилове на програмиране е объркващо.
SQL изразът е списък с условия - зависи от Oracle да реши как да създаде резултатния набор, който отговаря на тези условия. PL/SQL съхранената процедура е набор от инструкции, които променят нещата по много предвидим начин.
В примера по-долу, колко пъти трябва да pr
да бъде екзекутиран? Дали се изпълнява преди или след id = 1
? Ако SQL изразите имаха предварително дефиниран ред, тогава оптимизаторът нямаше да може да изпраща предикати, да обединява подзаявки и т.н. и производителността би била неприемлива.
select *
from table1
where id = 1
and pr;
Дори ако е използвана процедура в select
списък, може да няма смисъл. Например select
списък вътре в exists
винаги се игнорира.
select * from dual where exists (select pr from dual);
Но в действителност SQL изразите понякога трябва да взаимодействат с външния свят и е необходима някаква процедурна логика. Функциите са разрешени, защото обикновено просто изчислете нещо и върнете стойност. Функциите обикновено не зависят от състоянието на програмата и имат много странични ефекти. Вашите функции можеха използвайте сесийни променливи, актуализирайте таблици (ако е зададено на PRAGMA AUTONOMOUS TRANSACTION
), задайте контекст и т.н. Oracle не може да ви попречи да правите тези неща, но забраната на процедури в SQL изрази поне ще обезсърчи такъв код.