Das Problem, das Sie haben (vorausgesetzt, Sie rufen die korrekt benannte Prozedur/Funktion auf die richtige Weise auf), besteht darin, dass Sie versuchen, einen Aufruf einer Funktion aufzurufen, die noch nicht deklariert wurde. Es gibt zwei Möglichkeiten, dies zu umgehen, vorausgesetzt, Sie möchten die Funktion privat halten:
- Deklarieren Sie die Funktion ADD_STUDENT vor allen Prozeduren/Funktionen, die sie aufrufen.
- Verwenden Sie die Forward-Deklaration um die Funktion zu deklarieren, bevor sie aufgerufen wird.
Für Option 1 würde Ihr Beispielcode also folgendermaßen aussehen:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
Und für Option 2 würde Ihr Code so aussehen:
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;
/
Persönlich bevorzuge ich Option 1, da es bedeutet, dass weniger Dinge den Paketkörper überladen, aber Option 2 könnte notwendig sein, wenn Sie zwei Module haben, die sich gegenseitig referenzieren.