Compilación condicional en SQL
La compilación condicional permite a SQL incluir directivas de compilador que se utilizan para determinar el SQL real que se compila.
- Directiva de selección
- Sentencia de control de compilador que se utiliza para determinar la selección de un fragmento de código. La directiva _IF puede hacer referencia a directivas de consulta o variables globales que se han definido como una constante.
- Directiva de consulta
- Referencia a una constante con nombre de compilador que el sistema asigna o que se especifica como una constante con nombre de compilación condicional en CURRENT SQL_CCFLAGS. Una directiva de consulta puede utilizarse directamente o en una directiva de selección.
- Definiciones de procedimientos de SQL
- Definiciones de funciones de SQL compilado
- Definiciones de activadores compilados
- Definiciones de paquetes PL/SQL de Oracle
Directiva de selección
La directiva de selección es muy similar a la sentencia IF, a excepción de que existen prefijos en las palabras clave para indicar la utilización de compilación condicional y de que la palabra clave de terminación es _END.
- condición-búsqueda
- Especifica la condición que se evalúa para determinar qué fragmento-código, si existe, ha de incluirse. Si la condición es desconocida o falsa, la evaluación continúa con la siguiente condición de búsqueda, hasta que una condición es verdadera, se ha llegado a la cláusula _ELSE o se ha alcanzado el final de la directiva de selección. La condición de búsqueda sólo puede incluir los elementos siguientes (SQLSTATE 428HV):
- Constantes de tipo BOOLEAN, INTEGER o VARCHAR
- Constantes nulas (NULL)
- Directivas de consulta
- Constantes globales, donde el valor de constante definido es un literal simple de tipo BOOLEAN, INTEGER o VARCHAR
- Predicados básicos
- Predicados nulos (NULL)
- Predicados que son una constante booleana o una directiva de consulta booleana
- Operadores lógicos (AND, OR y NOT)
- fragmento-código
- Parte de código SQL que puede incluirse en el contexto de la sentencia de SQL donde aparece la directiva de selección. No debe ser una directiva de selección en fragmento-código (SQLSTATE 428HV).
Directiva de consulta
- Un valor de entorno de compilación que el sistema define
- Un valor de compilación que el usuario define en la base de datos o en la sesión individual
La única variable de entorno de compilación que el sistema define es __SQL_LINE, que proporciona el número de línea de SQL que está compilándose actualmente.
Una variable de compilación definida por el usuario puede definirse en la base de datos mediante la utilización del parámetro de configuración de base de datos sql_ccflags o bien en la sesión mediante la asignación de ésta al registro especial CURRENT SQL_CCFLAGS.
Si se hace referencia a una directiva de consulta pero ésta no se ha definido, el proceso continúa y se da por supuesto que el valor de la directiva de consulta es el valor nulo.
Notas
- Referencias a variables globales definidas como constantes: una referencia a una variable global (que también puede ser una referencia a una variable de módulo publicada en un módulo) de una directiva de selección sólo se utiliza para proporcionar un valor basado en una constante en tiempo de compilación. La variable global a la que se hace referencia debe satisfacer los requisitos siguientes:
- Debe existir en el servidor actual (SQLSTATE 42704)
- Debe tener un tipo de datos BOOLEAN, INTEGER o VARCHAR (SQLSTATE 428HV)
- Debe haberse definido mediante la utilización de la cláusula CONSTANT con un único valor de constante (SQLSTATE 428HV)
- Alternativas de sintaxis: si el entorno de servidor de datos se ha habilitado
para la ejecución de sentencias de PL/SQL:
- Puede especificarse ELSIF en lugar de ELSEIF
- Puede usarse un carácter de dólar ($) en lugar de un carácter de subrayado (_) como prefijo para las palabras clave para la compilación condicional
- Pueden usarse dos caracteres de dólar ($$) en lugar de dos caracteres de subrayado (__) como prefijo para una directiva de consulta
Ejemplo
UPDATE DATABASE CONFIGURATION USING SQL_CCFLAGS DB2V97:TRUEEl valor está disponible como valor por omisión para cualquier conexión que se establezca posteriormente con la base de datos. BEGIN
DECLARE CCFLAGS_LIST VARCHAR(1024);
SET CCFLAGS_LIST = CURRENT SQL_CCFLAGS CONCAT ',max_years:50';
SET CURRENT SQL_CCFLAGS = CCFLAGS_LIST;
ENDLa utilización de CURRENT SQL_CCFLAGS en la parte derecha de la asignación a la variable CCFLAGS_LIST conserva los valores SQL_CCFLAGS existentes, mientras que la constante de la serie proporciona los valores de compilación adicionales. CREATE PROCEDURE CHECK_YEARS (IN YEARS_WORKED INTEGER)
BEGIN
_IF __DB2V97 _THEN
IF YEARS_WORKED > __MAX_YEARS THEN
...
END IF;
_ENDLa directiva de consulta __DB2V97 se utiliza como valor booleano para determinar si el código puede incluirse. El valor de constante 50 sustituye la directiva de consulta __MAX_YEARS durante la compilación.