O problema que você tem (assumindo que você está chamando o procedimento/função corretamente nomeado da maneira correta) é que você está tentando invocar uma chamada para uma função que ainda não foi declarada. Existem duas maneiras de contornar isso, supondo que você queira manter a função privada:
- Declare a função ADD_STUDENT antes de qualquer procedimento/função que a invoque.
- Use declaração de encaminhamento para declarar a função antes de ser invocada.
Então, para a opção 1, seu código de exemplo ficaria assim:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
E para a opção 2, seu código ficaria assim:
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;
/
Pessoalmente, sou a favor da opção 1, pois significa que há menos coisas no corpo do pacote, mas a opção 2 pode ser necessária se você tiver dois módulos que fazem referência um ao outro.