Możesz użyć RESTRICT_REFERENCES aby wskazać, że funkcja nie będzie odczytywać/zapisywać stanu pakietu lub bazy danych.
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;
/
Kiedyś tak było, że SQL nie pozwalał na wywołanie funkcji, chyba że złożył taką obietnicę, ale to ograniczenie zostało usunięte.
Wolałbym zrobić z tego wyróżnik między procedurą a funkcją. Warto pamiętać, że jeśli funkcja PL/SQL zgłosi wyjątek NO_DATA_FOUND, wywołanie instrukcji SQL nie zawiedzie (ponieważ brak znalezionych danych nie jest błędem SQL). Dlatego wolę używać procedur, chyba że obiekt jest specjalnie zaprojektowany do wywoływania z SQL.