Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Chamando a função privada no corpo do pacote


O problema que você tem (assumindo que você está chamando o procedimento/função corretamente nomeado da maneira correta) é que você está tentando invocar uma chamada para uma função que ainda não foi declarada. Existem duas maneiras de contornar isso, supondo que você queira manter a função privada:
  1. Declare a função ADD_STUDENT antes de qualquer procedimento/função que a invoque.
  2. Use declaração de encaminhamento para declarar a função antes de ser invocada.

Então, para a opção 1, seu código de exemplo ficaria assim:
PACKAGE BODY SCHOOL AS
    FUNCTION ADD_STUDENT(...)
        ...
    END ADD_STUDENT;

    PROCEDURE ADD_PEOPLE(...)
        ...
        some_var := ADD_STUDENT();
    END ADD_PEOPLE;
END SCHOOL;
/

E para a opção 2, seu código ficaria assim:
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;
/

Pessoalmente, sou a favor da opção 1, pois significa que há menos coisas no corpo do pacote, mas a opção 2 pode ser necessária se você tiver dois módulos que fazem referência um ao outro.