Problém, který máte (za předpokladu, že voláte správně pojmenovanou proceduru/funkci správným způsobem), je ten, že se pokoušíte vyvolat volání funkce, která ještě nebyla deklarována. Existují dva způsoby, jak to obejít, za předpokladu, že chcete zachovat soukromou funkci:
- Deklarujte funkci ADD_STUDENT před všemi procedurami/funkcemi, které ji vyvolávají.
- Použijte předběžnou deklaraci deklarovat funkci před jejím vyvoláním.
Takže pro možnost 1 by váš příklad kódu vypadal takto:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
A pro možnost 2 by váš kód vypadal takto:
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;
/
Osobně upřednostňuji možnost 1, protože to znamená, že tělo balíčku zaplňuje méně věcí, ale možnost 2 může být nezbytná, pokud máte dva moduly, které na sebe odkazují.