SQL> SQL> -- Forward declarations is needed in circular referencing, SQL> -- not needed for self-referencing. SQL> SQL> create or replace package test_pkg_a as 2 function func3(p1 number) return number; 3 end test_pkg_a ; 4 / Package created. SQL> SQL> -- func1 and func2 are private functions SQL> SQL> create or replace package body test_pkg_a as 2 -- Forward declare private function func2 3 function func2(p1 number) return number; 4 5 function func1(p1 number) return number 6 is 7 begin 8 If p1 > 20 then 9 return p1; 10 else 11 return func2(p1+1); 12 end if; 13 end; 14 15 function func2(p1 number) return number 16 is 17 begin 18 If p1 > 20 then 19 return p1; 20 else 21 return func1(p1+1); 22 end if; 23 end; 24 25 function func3(p1 number) return number 26 is 27 begin 28 return func1(p1); 29 end; 30 31 end; 32 / Package body created. SQL> SQL> select test_pkg_a.func3(30) from dual; TEST_PKG_A.FUNC3(30) -------------------- 30 SQL> select test_pkg_a.func3(10) from dual; TEST_PKG_A.FUNC3(10) -------------------- 21 SQL> SQL> create or replace package body test_pkg_a as 2 -- A self-referencing function 3 function func3(p1 number) return number 4 is 5 begin 6 if p1 < 100 then 7 return func3(p1+10); 8 else 9 return p1; 10 end if; 11 end; 12 13 end; 14 / Package body created. SQL> SQL> select test_pkg_a.func3(10) from dual; TEST_PKG_A.FUNC3(10) -------------------- 100 SQL> select test_pkg_a.func3(200) from dual; TEST_PKG_A.FUNC3(200) --------------------- 200 SQL> SQL> drop package test_pkg_a; Package dropped. SQL> SQL> spool off