Problem, który masz (zakładając, że wywołujesz poprawnie nazwaną procedurę/funkcję we właściwy sposób) polega na tym, że próbujesz wywołać funkcję, która nie została jeszcze zadeklarowana. Można to obejść na dwa sposoby, zakładając, że chcesz zachować prywatność funkcji:
- Zadeklaruj funkcję ADD_STUDENT przed wszelkimi procedurami/funkcjami, które ją wywołują.
- Użyj deklaracji przekazywania aby zadeklarować funkcję przed jej wywołaniem.
Tak więc dla opcji 1 przykładowy kod będzie wyglądał następująco:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
A dla opcji 2 twój kod wyglądałby tak:
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;
/
Osobiście preferuję opcję 1, ponieważ oznacza ona, że jest mniej rzeczy zaśmiecających ciało pakietu, ale opcja 2 może być konieczna, jeśli masz dwa moduły, które odwołują się do siebie.