Er is een manier om dit te doen, op voorwaarde dat u 10g of hoger gebruikt. Het wordt voorwaardelijke compilatie genoemd. Dit is een zeer handige functie die een speciale syntaxis biedt, zodat we onze PL/SQL-code tijdens het compileren kunnen wijzigen.
Toevallig heb ik deze functie juist gebruikt om privépakketten in een specificatie bloot te leggen, zodat ik UTPLSQL-tests ertegen kan uitvoeren.
Hier is de speciale syntaxis:
create or replace package my_pkg
as
$IF $$dev_env_test $THEN
PROCEDURE private_proc;
$END
FUNCTION public_function return date;
end my_pkg;
/
Die variabele met het dubbele dollarteken is een voorwaardelijke compilatievlag.
Als ik het pakket beschrijf, kunnen we alleen het openbare pakket zien:
SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE
SQL>
Nu stel ik de voorwaardelijke vlag in en compileer het pakket opnieuw, en als bij toverslag ...
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>
Het privatiseren van de functies is zo eenvoudig als u denkt:
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>
We kunnen veel meer doen met voorwaardelijke compilatie. Het staat in de documenten. Meer informatie.