Oracle
 sql >> Database >  >> RDS >> Oracle

Chiamare la funzione privata all'interno del corpo del pacchetto

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:

  1. Dichiara la funzione ADD_STUDENT prima di qualsiasi procedura/funzione che la invoca.
  2. 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.