Процедуры не допускаются в операторах 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 будет по крайней мере, обескуражить такой код.