Problemet du har (forudsat at du kalder den korrekt navngivne procedure/funktion på den korrekte måde) er, at du forsøger at kalde et kald til en funktion, der endnu ikke er blevet erklæret. Der er to måder omkring dette, forudsat at du vil holde funktionen privat:
- Erklær funktionen ADD_STUDENT før alle procedurer/funktioner, der påkalder den.
- Brug fremsende erklæring for at erklære funktionen, før den aktiveres.
Så for mulighed 1 vil din eksempelkode se ud som:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
Og for mulighed 2 vil din kode se sådan ud:
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;
/
Personligt foretrækker jeg mulighed 1, da det betyder, at der er færre ting, der roder pakkens krop, men mulighed 2 kan være nødvendig, hvis du har to moduler, der refererer til hinanden.