Cuando trabajamos con
diferentes ambientes de desarrollo, como dev, test, producción, tenemos la
necesidad de avanzar funcionalidad en PLSQL en forma parcial, ya sea por que
las tablas no existan en test o produccion, o por objetos no soportados por la
base de datos; Puede darse el caso en que no sepamos la versión de la BD donde
se instalara nuestro sistema y tenemos que agregar un soporte para X versión,
pero como continuar desarollando sin tener diferentes versiones de código o
diferentes archivos.
La
solución es usar compilacion condicional en ingles (Conditional compilation), este un concepto agregado a pl/sql el
cual nos permite compilar bloques de código dependiendo de una condición, dicha
condición la podemos activar o desactivar cuando realizamos la compilación de
nuestros packages o procedures.
Conditional
compilation puede soportar las siguientes directivas para su uso:
- PLSQL_CCFlags
- PLSQL_Code_Type
- PLSQL_Debug
- PLSQL_Optimize_Level
- PLSQL_Warnings
- PLSQL_Unit
- PLSQL_Line
Para verlo de forma
sencilla solo usaremos PLSQL_CCFlags que nos servira para declarar
variables que evaluaremos con un $IF , y dependiendo de esto, el código dentro
se compilara o no.
Veamos
un ejemplo:
Declaramos
nuestra variable (IS_PRODUCTION) con un alter y luego compilaremos el procedure
usando esta variable.
El
uso del símbolo de dólar es obligatorio para identificar la compilacion
condicional, en este ejemplo indico que si la variable está declarada en TRUE,
se compilara solo el código dentro del bloque true del IF, para lo cual
cuando ejecutemos deberíamos tener un resultado de 1.
Para verificar nuestra compilacion podemos usar dbms_preprocessor.print_post_processed_source
que nos mostrara como esta compilado el codigo:
Ahora ejecutaremos el procedure para ver los resultados que tenemos:
Y confirmamos que se ejecuto con el codigo 1:
Ahora haremos el proceso inverso, colocando en false.
Podemos darle muchos usos al uso de la compilacion condicional (conditional compilation) , aqui les dejo algunas referencias y los links de acceso al codigo.
Código ejemplo: link
Referencias: