sql >> Base de Datos >  >> RDS >> Oracle

¿Por qué no podemos ejecutar el procedimiento almacenado en la declaración de selección en Oracle? ¿Hay alguna razón fuerte?

Los procedimientos no están permitidos en sentencias SQL porque mezclar estilos de programación declarativos e imperativos es confuso.

Una instrucción SQL es una lista de condiciones:depende de Oracle decidir cómo producir el conjunto de resultados que coincida con esas condiciones. Un procedimiento almacenado PL/SQL es un conjunto de instrucciones que cambian las cosas de una forma muy predecible.

En el siguiente ejemplo, ¿cuántas veces debería pr ¿ser ejecutado? ¿Se ejecuta antes o después de id = 1? ? Si las instrucciones SQL tuvieran un orden predefinido, el optimizador no podría enviar predicados, fusionar subconsultas, etc., y el rendimiento sería inaceptable.

select *
from table1
where id = 1
    and pr;

Incluso si se utilizó un procedimiento en el select lista, puede que no tenga sentido. Por ejemplo, el select lista dentro de un exists siempre se ignora.

select * from dual where exists (select pr from dual);

Pero, en realidad, las sentencias de SQL a veces necesitan interactuar con el mundo exterior y se necesita algo de lógica de procedimiento. Las funciones están permitidas porque generalmente simplemente calcule algo y devuelva un valor. Las funciones normalmente no dependen del estado del programa y tienen muchos efectos secundarios. Sus funciones podrían use variables de sesión, actualice tablas (si está configurado en PRAGMA AUTONOMOUS TRANSACTION ), establezca un contexto, etc. Oracle no puede evitar que haga esas cosas, pero prohibir los procedimientos en las declaraciones SQL al menos desalentará dicho código.