El problema que tiene (suponiendo que está llamando al procedimiento/función con el nombre correcto de la manera correcta) es que está intentando invocar una llamada a una función que aún no se ha declarado. Hay dos formas de evitar esto, suponiendo que desee mantener la función en privado:
- Declare la función ADD_STUDENT antes de cualquier procedimiento/función que la invoque.
- Utilice declaración directa para declarar la función antes de que se invoque.
Entonces, para la opción 1, su código de ejemplo se vería así:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
Y para la opción 2, su código se vería así:
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;
/
Personalmente, prefiero la opción 1, ya que significa que hay menos cosas abarrotando el cuerpo del paquete, pero la opción 2 podría ser necesaria si tiene dos módulos que hacen referencia entre sí.