Sentencia EVAL

La sentencia EVAL toma un valor de carácter, lo interpreta como una sentencia SQL y lo procesa.

La función EVAL (que también se describe aquí) toma un valor de carácter pero lo interpreta como una expresión SQL que devuelve un valor.

Nota: Las funciones y procedimientos definidos por el usuario no se pueden definir en una sentencia o función EVAL.

SINTAXIS

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.

Una vez completada esta evaluación de primera fase, el comportamiento de EVAL depende de si se está utilizando como una sentencia ESQL completa o en lugar de una expresión que forma parte de una sentencia ESQL:
  • Si se trata de una sentencia ESQL completa, la serie de caracteres derivada de la evaluación de primera fase se ejecuta como si fuera una sentencia ESQL.
  • Si se trata de una expresión que forma parte de una sentencia ESQL, la serie de caracteres se evalúa como si fuera una expresión ESQL y EVAL devuelve el resultado.

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.

Los ejemplos siguientes son usos válidos de EVAL:
  • SET OutputRoot.XML.Data.Result = EVAL(A+B);

    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.

  • SET OutputRoot.XML.Data.Result = EVAL('A' || operatorAsString || 'B');
  • EVAL('SET ' || scalarVar1 || ' = 2;');

    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. De este modo, EVAL es similar a una función, en la que las variables declaradas localmente sólo son locales y salen del ámbito cuando se sale de la función.

EVAL resulta especialmente útil porque permite crear dinámicamente sentencias ESQL o expresiones. 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 u otro valor dinámico, con lo que se puede controlar de forma eficaz qué ESQL se ejecuta, 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, ejecutar y crear dinámicamente sentencias o expresiones requiere mucho más tiempo que ejecutar 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.

Los siguientes no son usos válidos de EVAL:
  • SET EVAL(scalarVar1) = 2;

    En este ejemplo, EVAL se utiliza para sustituir una referencia de campo y no una expresión.

  • SET OutputRoot.XML.Data.Result[] = EVAL((SELECT T.x FROM Database.y AS T));

    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.

El ejemplo siguiente resulta aceptable porque (SELECT T.x FROM Database.y AS T) es un literal de serie de caracteres y no una expresión propiamente dicha y, por lo tanto, se puede representar como una serie de caracteres.
SET OutputRoot.XML.Data.Result[]
 = EVAL('(SELECT T.x FROM Database.y AS T)');
Conceptos relacionados
Visión general de ESQL
Tareas relacionadas
Desarrollo de ESQL
Referencia relacionada
Diagramas de sintaxis: tipos disponibles
Sentencias ESQL
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ak05020_