La sentencia EVAL toma un valor de carácter, lo interpreta como una sentencia SQL y procesa dicha sentencia.
Para obtener información detallada sobre la función EVAL, consulte Función EVAL.
EVAL toma un parámetro con formato de expresión, evalúa esta expresión y efectúa una transformación CAST del valor resultante en una serie de caracteres si éste no lo es todavía. Por lo tanto, la expresión que se pasa a EVAL debe poder representarse como una serie de caracteres.
No se pueden definir procedimientos definidos por el usuario dentro de una sentencia EVAL, pero EVAL se puede utilizar para llamar a un procedimiento definido por el usuario que esté en el ámbito en el que se utiliza la sentencia EVAL.
IF (FALSE) THEN CALL procedimiento(<parámetros>); END IF;
Tenga en cuenta que, en el código anterior, debe sustituir
procedimiento() por el procedimiento con nombre en cuestión.En los ejemplos siguientes, A y B son variables escalares con un valor de entero y scalarVar1 y OperatorAsString son valores escalares de serie de caracteres.
La expresión A+B es aceptable porque aunque devuelve un valor de entero, los valores de entero se pueden representar como series de caracteres y la transformación CAST necesaria se realiza antes de que EVAL pase a la segunda fase de la evaluación.
El signo de punto y coma que se incluye al final del literal de serie final es necesario porque si se utiliza EVAL en lugar de una sentencia ESQL, su primera fase de evaluación debe devolver una serie que represente una sentencia ESQL válida, incluido el punto y coma final.
Las variables declaradas en una sentencia EVAL no existen fuera de dicha sentencia EVAL.
EVAL resulta especialmente útil porque permite crear dinámicamente sentencias o expresiones ESQL. En el segundo y tercer ejemplo anterior, el valor de scalarVar1 u operatorAsString se puede establecer según el valor de un campo de mensaje de entrada, o de otro valor dinámico, con lo que se puede controlar de forma eficaz qué ESQL se procesa, sin que sea necesaria una escalera de IF-THEN que potencialmente puede resultar muy larga.
No obstante, tenga en cuenta las implicaciones que el uso de EVAL puede tener en el rendimiento. Necesariamente, procesar y crear dinámicamente sentencias o expresiones requiere mucho más tiempo que procesar simplemente otras que ya se han creado previamente. Si el rendimiento es vital, es posible que prefiera escribir ESQL más específico pero más rápido.
En este ejemplo, EVAL se utiliza para sustituir una referencia de campo y no una expresión.
En este ejemplo, se pasa (SELECT T.x FROM Database.y) a EVAL y devuelve una lista que no puede representarse como una serie de caracteres.
SET OutputRoot.XMLNS.Data.Result[]
= EVAL('(SELECT T.x FROM Database.y AS T)');
Las funciones a las que se hace referencia solamente en una sentencia EVAL, y no en el resto del módulo ESQL, es posible que no estén incluidas en el archivo BAR. En los ejemplos siguientes, debe hacerse referencia a la función MyFunction en algún otro lugar del módulo ESQL, de lo contrario, el archivo BAR puede fallar en el despliegue.
EVAL('CALL MyFunction(parm1, parm2);');
DECLARE functionName CHARACTER 'Function';
DECLARE callStmt CHARACTER 'CALL My' || functionName || '(parm1, parm2);';
EVAL(callStmt);