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.