Du kan använda RESTRICT_REFERENCES för att indikera att en funktion inte kommer att läsa/skriva paket eller databastillstånd.
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 brukade vara så att SQL inte tillät dig att anropa en funktion om den inte gav ett sådant löfte, men den begränsningen försvann.
Jag föredrar att göra det till en skillnad mellan en procedur och en funktion. Det är värt att komma ihåg att om en PL/SQL-funktion ger ett NO_DATA_FOUND-undantag, misslyckas inte en anropande SQL-sats (eftersom ingen data hittas inte är ett SQL-fel). Så jag föredrar att använda procedurer om inte objektet är specifikt utformat för att anropas från SQL.