Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que não podemos executar o procedimento armazenado na instrução select no oracle? existe algum motivo forte?


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.