Nada que ver con la declaración de reenvío en absoluto.
Esto se relaciona con el hecho de que está utilizando una consulta SQL para llamar a la función . Parece que cuando usa una declaración para invocar una función, ya no está dentro del alcance del paquete PL/SQL, por lo que solo puede llamar a funciones disponibles públicamente.
En cuanto al porqué , solo puedo adivinar, así que no lo tome por sentado, pero PL/SQL y SQL tienen diferentes motores . Entonces, al hacer una consulta sql, incluso dentro de su paquete pl/sql, va al nivel de SQL donde verificará nuevamente los permisos de acuerdo con el motor SQL. Por lo tanto, no tiene idea de que se ejecuta desde un paquete PL/SQL y debería poder llamar a la función privada.
Creo que la diferencia de motores se puede verificar fácilmente, intente usar un varchar2 de 32000, funcionará dentro de su función pl/sql. Ahora, si llama a su función pl/sql y devuelve un varchar2(32000)
, fallará. Este es un problema que encontré, pero no tengo ninguna base de datos para darle un fragmento.