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

Semântica de procedimentos/funções armazenadas do Oracle em um contexto transacional


Você pode usar RESTRICT_REFERENCES para indicar que uma função não lerá/gravará o estado do pacote ou do banco de dados.
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;
/

Costumava acontecer que o SQL não permitia que você chamasse uma função a menos que fizesse tal promessa, mas essa restrição foi descartada.

Eu preferiria torná-lo um diferenciador entre um procedimento e uma função. Vale lembrar que, se uma função PL/SQL gerar uma exceção NO_DATA_FOUND, uma instrução SQL de chamada não falhará (pois nenhum dado encontrado não é um erro SQL). Portanto, prefiro usar procedimentos, a menos que o objeto seja projetado especificamente para ser chamado do SQL.