Проблемът, който имате (ако приемем, че извиквате правилно наречената процедура/функция по правилния начин) е, че се опитвате да извикате извикване на функция, която все още не е декларирана. Има два начина за това, ако приемем, че искате да запазите функцията частна:
- Декларирайте функцията ADD_STUDENT преди всякакви процедури/функции, които я извикват.
- Използвайте предаваща декларация за деклариране на функцията, преди да бъде извикана.
И така, за опция 1 вашият примерен код ще изглежда така:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
А за вариант 2 вашият код ще изглежда така:
PACKAGE BODY SCHOOL AS
-- forward declared function
FUNCTION ADD_STUDENT(...);
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
END SCHOOL;
/
Лично аз предпочитам вариант 1, тъй като това означава, че има по-малко неща, които претрупват тялото на пакета, но вариант 2 може да е необходим, ако имате два модула, които се препращат един към друг.