Existe uma maneira de fazer isso, desde que você esteja em 10g ou superior. Chama-se Compilação Condicional. Este é um recurso altamente interessante que fornece uma sintaxe especial para que possamos alterar nosso código PL/SQL no momento da compilação.
Acontece que eu tenho usado esse recurso precisamente para expor pacotes privados em uma especificação para que eu possa executar testes UTPLSQL neles.
Aqui está a sintaxe especial:
create or replace package my_pkg
as
$IF $$dev_env_test $THEN
PROCEDURE private_proc;
$END
FUNCTION public_function return date;
end my_pkg;
/
Essa variável com o sinal de dólar duplo é um sinalizador de compilação condicional.
Se eu descrever o pacote, podemos ver apenas o pacote público:
SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE
SQL>
Agora eu defino o sinalizador condicional e recompilo o pacote, e como que por mágica...
SQL> alter session set plsql_ccflags='dev_env_test:true'
2 /
Session altered.
SQL> alter package my_pkg compile
2 /
Package altered.
SQL> desc my_pkg
PROCEDURE PRIVATE_PROC
FUNCTION PUBLIC_FUNCTION RETURNS DATE
SQL>
Privatizar as funções é tão simples quanto você pensa que seria:
SQL> alter session set plsql_ccflags='dev_env_test:false'
2 /
Session altered.
SQL> alter package my_pkg compile
2 /
Package altered.
SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE
SQL>
Podemos fazer muito mais com a compilação condicional. Está coberto nos documentos. Saiba mais.