Oracle
 sql >> Base de données >  >> RDS >> Oracle

Sémantique des procédures/fonctions stockées Oracle dans un contexte transactionnel

Vous pouvez utiliser RESTRICT_REFERENCES pour indiquer qu'une fonction ne lira/écrira pas le package ou l'état de la base de données.

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;
/

Auparavant, SQL ne vous permettait pas d'appeler une fonction à moins qu'il ne fasse une telle promesse, mais cette restriction a été abandonnée.

Je préférerais en faire un différenciateur entre une procédure et une fonction. Il convient de garder à l'esprit que si une fonction PL/SQL déclenche une exception NO_DATA_FOUND, une instruction SQL appelante n'échoue pas (car aucune donnée trouvée n'est pas une erreur SQL). Je préfère donc utiliser des procédures à moins que l'objet ne soit spécifiquement conçu pour être appelé depuis SQL.