sql >> Databasteknik >  >> RDS >> Oracle

Anropar privat funktion inom paketets kropp

Problemet du har (förutsatt att du anropar den korrekt namngivna proceduren/funktionen på rätt sätt) är att du försöker anropa ett anrop till en funktion som ännu inte har deklarerats. Det finns två sätt att kringgå detta, förutsatt att du vill hålla funktionen privat:

  1. Deklarera funktionen ADD_STUDENT före alla procedurer/funktioner som anropar den.
  2. Använd framåtriktad deklaration för att deklarera funktionen innan den anropas.

Så för alternativ 1 skulle din exempelkod se ut så här:

PACKAGE BODY SCHOOL AS
    FUNCTION ADD_STUDENT(...)
        ...
    END ADD_STUDENT;

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

Och för alternativ 2 skulle din kod se ut så här:

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;
/

Personligen föredrar jag alternativ 1, eftersom det betyder att det finns mindre saker som rör ihop paketets kropp, men alternativ 2 kan vara nödvändigt om du har två moduler som refererar till varandra.



  1. Hur använder man en SQL for loop för att infoga rader i databasen?

  2. ImportError:Ingen modul med namnet connector.conversion

  3. välj summakvantitet från 2 tabeller

  4. Lagra och jämföra unika kombinationer