Oracle
 sql >> Base de données >  >> RDS >> Oracle

Appeler une fonction privée dans le corps du package

Le problème que vous rencontrez (en supposant que vous appelez correctement la procédure/fonction correctement nommée) est que vous essayez d'invoquer un appel à une fonction qui n'a pas encore été déclarée. Il y a deux façons de contourner cela, en supposant que vous souhaitiez garder la fonction privée :

  1. Déclarez la fonction ADD_STUDENT avant toute procédure/fonction qui l'invoque.
  2. Utiliser déclaration avant pour déclarer la fonction avant qu'elle ne soit invoquée.

Ainsi, pour l'option 1, votre exemple de code ressemblerait à :

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

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

Et pour l'option 2, votre code ressemblerait à :

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

Personnellement, je préfère l'option 1, car cela signifie qu'il y a moins de choses qui encombrent le corps du paquet, mais l'option 2 peut être nécessaire si vous avez deux modules qui se référencent.