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

Semántica de procedimientos/funciones almacenados de Oracle en un contexto transaccional

Puede usar RESTRICT_REFERENCES para indicar que una función no leerá/escribirá el paquete o el estado de la base de datos.

CREATE PACKAGE t_pkg AS
   FUNCTION showup (msg VARCHAR2) RETURN VARCHAR2;
   PRAGMA RESTRICT_REFERENCES(showup, WNDS, RNDS);
END t_pkg;
/
-- create the package body
CREATE OR REPLACE PACKAGE BODY t_pkg AS
   FUNCTION showup (msg VARCHAR2) RETURN VARCHAR2 IS
    v_val varchar2(1);
   BEGIN
      select dummy into v_val from dual;
      RETURN v_val;
   END;
END t_pkg;
/

Antes, SQL no le permitía llamar a una función a menos que hiciera esa promesa, pero esa restricción se eliminó.

Preferiría convertirlo en un diferenciador entre un procedimiento y una función. Vale la pena tener en cuenta que si una función PL/SQL genera una excepción NO_DATA_FOUND, una instrucción SQL de llamada no falla (ya que no se encuentran datos no es un error de SQL). Así que prefiero usar procedimientos a menos que el objeto esté específicamente diseñado para ser llamado desde SQL.