CREATE OR REPLACE FUNCTION granted_function
RETURN VARCHAR2
   ACCESSIBLE BY
   (FUNCTION known_function,
    PROCEDURE known_procedure
   )
IS
BEGIN
   RETURN 'Execution Granted!';
END;
/

CREATE OR REPLACE FUNCTION known_function
RETURN VARCHAR2
IS
   received VARCHAR2(50);
BEGIN
   received := granted_function();
   DBMS_OUTPUT.PUT_LINE('Received: ' || received);
   RETURN '';
END;
/

SET SERVEROUTPUT ON
SELECT known_function() FROM dual;

CREATE OR REPLACE FUNCTION unknown_function
RETURN VARCHAR2
IS
   received VARCHAR2(50);
BEGIN
   received := granted_function();
   DBMS_OUTPUT.PUT_LINE('Received: ' || received);
   RETURN '';
END;
/
   
SHOW ERRORS

DROP FUNCTION granted_function;

DROP FUNCTION known_function;

DROP FUNCTION unknown_function;