Rien à voir avec la déclaration préalable.
Cela concerne le fait que vous utilisez une requête SQL pour appeler la fonction . Il semble que lorsque vous utilisez une instruction pour appeler une fonction, vous n'êtes plus dans le champ d'application du package PL/SQL, vous ne pouvez donc appeler que des fonctions accessibles au public.
Quant au pourquoi , je ne peux que deviner, alors ne le prenez pas pour acquis, mais PL/SQL et SQL ont des moteurs différents . Ainsi, lorsque vous effectuez une requête sql, même à l'intérieur de votre package pl/sql, vous accédez au niveau de SQL où il vérifiera à nouveau les autorisations en fonction du moteur SQL. Il n'a donc aucune idée qu'il est exécuté à partir d'un package PL/SQL et vous devriez être autorisé à appeler la fonction privée.
Je pense que la différence de moteurs peut être vérifiée facilement, essayez d'utiliser un varchar2 de 32000, cela fonctionnera dans votre fonction pl/sql. Maintenant, si vous appelez votre fonction pl/sql renvoyant un varchar2(32000)
, ça va échouer. C'est un problème que j'ai rencontré, mais je n'ai pas de base de données pour vous donner un extrait.