Il problema che hai (supponendo che stai chiamando la procedura/funzione correttamente denominata nel modo corretto) è che stai tentando di invocare una chiamata a una funzione che non è stata ancora dichiarata. Ci sono due modi per aggirare questo, supponendo che tu voglia mantenere la funzione privata:
- Dichiara la funzione ADD_STUDENT prima di qualsiasi procedura/funzione che la invoca.
- Utilizza dichiarazione anticipata per dichiarare la funzione prima che venga invocata.
Quindi, per l'opzione 1, il tuo codice di esempio sarebbe simile a:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
E per l'opzione 2 il tuo codice sarebbe simile a:
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, preferisco l'opzione 1, poiché significa che ci sono meno cose che ingombrano il corpo del pacchetto, ma l'opzione 2 potrebbe essere necessaria se hai due moduli che fanno riferimento a vicenda.