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:
Resultado, como vemos el codigo que se compilo fue del bloque TRUE:
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:
Published by Angel O. Flores Torres
System engineer, Applications engineer, working with C# and Oracle Apex 5, 5.1 since 2017. I specialize in Oracle APEX (Oracle Application Express )
View all posts by Angel O. Flores Torres