Můžete použít RESTRICT_REFERENCES k označení, že funkce nebude číst/zapisovat stav balíčku nebo databáze.
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;
/
Dříve platilo, že vám SQL neumožňovalo volat funkci, pokud to nedalo takový slib, ale toto omezení bylo zrušeno.
Raději bych z toho udělal rozlišovací znak mezi procedurou a funkcí. Stojí za to mít na paměti, že pokud funkce PL/SQL vyvolá výjimku NO_DATA_FOUND, volající příkaz SQL se nezdaří (protože žádná nalezená data nejsou chybou SQL). Takže raději používám procedury, pokud není objekt speciálně navržen pro volání z SQL.