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

Ringer til privat funktion i pakketeksten

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:

  1. Erklær funktionen ADD_STUDENT før alle procedurer/funktioner, der påkalder den.
  2. 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.



  1. Begynderspørgsmål om mySQL og PHP for at undgå at oprette forbindelse til DB på hver side

  2. Migration udenlandsk nøgle vs veltalende forhold i Laravel

  3. Fjerner Oracle Data Provider til .NET fra Global Assembly Cache

  4. COUNT(*) returnerer flere rækker i stedet for kun én