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.

Existen dos tipos de directivas de compilador que pueden utilizarse para la compilación condicional:
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.
Estas directivas pueden utilizarse en los contextos que se indican a continuación:
  • Definiciones de procedimientos de SQL
  • Definiciones de funciones de SQL compilado
  • Definiciones de activadores compilados
  • Definiciones de paquetes PL/SQL de Oracle
Una directiva sólo puede aparecer después del tipo de objeto (FUNCTION, PACKAGE, PACKAGE BODY, PROCEDURE o TRIGGER) que se ha identificado en la sentencia de lenguaje de definición.

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.

Leer el esquema de sintaxisOmitir el esquema de sintaxis visual_IFcondición-búsqueda_THENfragmento-código _ELSEIFcondición-búsqueda_THENfragmento-código _ELSEfragmento-código _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

Una directiva de consulta se utiliza para realizar consultas relacionadas con el entorno de compilación. En una sentencia de SQL, una directiva de consulta se especifica como identificador normal precedido de dos caracteres de subrayado. El identificador real puede representar uno de los valores siguientes:
  • 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)
    Una variable global de este tipo se denomina constante global. Los cambios que posteriormente se realicen en la constante global no tendrán ningún efecto en las sentencias que ya se han compilado.
  • 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
    La única finalidad del prefijo del carácter del dólar es dar soporte a las sentencias de SQL existentes que utilizan directivas de consulta y no se recomienda utilizarlo para escribir nuevas sentencias de SQL.

Ejemplo

Especificar un valor para toda la base de datos para un valor de compilación denominado DBV97 que tenga el valor TRUE.
   UPDATE DATABASE CONFIGURATION USING SQL_CCFLAGS DB2V97:TRUE
El valor está disponible como valor por omisión para cualquier conexión que se establezca posteriormente con la base de datos.
Si una sesión en particular ha necesitado un valor de compilación de número máximo de años para su utilización en la definición de algunas rutinas en la sesión actual, el valor por omisión SQL_CCFLAGS puede ampliarse mediante la utilización de la sentencia SET CURRENT SQL_CCFLAGS.
   BEGIN
     DECLARE CCFLAGS_LIST VARCHAR(1024);
     SET CCFLAGS_LIST = CURRENT SQL_CCFLAGS CONCAT ',max_years:50';
     SET CURRENT SQL_CCFLAGS = CCFLAGS_LIST;
   END
La 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.
A continuación se muestra un ejemplo de una sentencia CREATE PROCEDURE que utiliza el contenido de CURRENT SQL_CCFLAGS.
   CREATE PROCEDURE CHECK_YEARS (IN YEARS_WORKED INTEGER)
   BEGIN
      _IF __DB2V97 _THEN
         IF YEARS_WORKED > __MAX_YEARS THEN
         ...
         END IF;
      _END
La 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.