Le problème que vous rencontrez (en supposant que vous appelez correctement la procédure/fonction correctement nommée) est que vous essayez d'invoquer un appel à une fonction qui n'a pas encore été déclarée. Il y a deux façons de contourner cela, en supposant que vous souhaitiez garder la fonction privée :
- Déclarez la fonction ADD_STUDENT avant toute procédure/fonction qui l'invoque.
- Utiliser déclaration avant pour déclarer la fonction avant qu'elle ne soit invoquée.
Ainsi, pour l'option 1, votre exemple de code ressemblerait à :
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
Et pour l'option 2, votre code ressemblerait à :
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;
/
Personnellement, je préfère l'option 1, car cela signifie qu'il y a moins de choses qui encombrent le corps du paquet, mais l'option 2 peut être nécessaire si vous avez deux modules qui se référencent.