Os procedimentos não são permitidos em instruções SQL porque misturar estilos de programação declarativos e imperativos é confuso.
Uma instrução SQL é uma lista de condições - cabe ao Oracle decidir como produzir o conjunto de resultados que corresponda a essas condições. Um procedimento armazenado PL/SQL é um conjunto de instruções que alteram as coisas de uma maneira muito previsível.
No exemplo abaixo, quantas vezes deve
pr
ser executado? É executado antes ou depois de id = 1
? Se as instruções SQL tivessem uma ordem predefinida, o otimizador não seria capaz de enviar predicados, mesclar subconsultas etc., e o desempenho seria inaceitável. select *
from table1
where id = 1
and pr;
Mesmo se um procedimento for usado no
select
lista, pode não fazer sentido. Por exemplo, o select
lista dentro de um exists
é sempre ignorado. select * from dual where exists (select pr from dual);
Mas, na realidade, as instruções SQL às vezes precisam interagir com o mundo exterior, e alguma lógica de procedimento é necessária. As funções são permitidas porque geralmente basta calcular algo e retornar um valor. As funções normalmente não dependem do estado do programa e têm muitos efeitos colaterais. Suas funções poderiam use variáveis de sessão, atualize tabelas (se estiver definido como
PRAGMA AUTONOMOUS TRANSACTION
), definir um contexto, etc. O Oracle não pode impedi-lo de fazer essas coisas, mas não permitir procedimentos em instruções SQL pelo menos desencorajará esse código.