Oracle
 sql >> Database >  >> RDS >> Oracle

Semantica delle stored procedure/funzioni Oracle in un contesto transazionale

Puoi utilizzare RESTRICT_REFERENCES per indicare che una funzione non leggerà/scriverà il pacchetto o lo stato del database.

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

In passato SQL non ti permetteva di chiamare una funzione a meno che non facesse una tale promessa, ma quella restrizione è stata abbandonata.

Preferirei renderlo un differenziatore tra una procedura e una funzione. Vale la pena ricordare che se una funzione PL/SQL genera un'eccezione NO_DATA_FOUND, un'istruzione SQL chiamante non fallisce (poiché nessun dato trovato non è un errore SQL). Quindi preferisco usare le procedure a meno che l'oggetto non sia specificamente progettato per essere chiamato da SQL.