Du kan bruge RESTRICT_REFERENCES for at angive, at en funktion ikke vil læse/skrive pakke- eller databasetilstand.
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;
/
Det plejede at være sådan, at SQL ikke tillod dig at kalde en funktion, medmindre den gav et sådant løfte, men den begrænsning blev droppet.
Jeg foretrækker at gøre det til en skelnen mellem en procedure og en funktion. Det er værd at huske på, at hvis en PL/SQL-funktion fremkalder en NO_DATA_FOUND-undtagelse, fejler en kaldende SQL-sætning ikke (da ingen fundet data ikke er en SQL-fejl). Så jeg foretrækker at bruge procedurer, medmindre objektet er specifikt designet til at blive kaldt fra SQL.