Sentencia EVAL

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

La función EVAL (también descrita aquí) toma un valor de caracteres, pero lo interpreta como una expresión ESQL que devuelve un valor.

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

Sintaxis

EVAL toma un parámetro en el formato de una expresión, evalúa esta expresión y emite el valor resultante a una serie de caracteres si no lo es ya. Por consiguiente, una expresión que se pasa a EVAL debe poderse representar como una serie de caracteres.

Después de completar esta evaluación de la primera fase, el comportamiento de EVAL dependerá de si se utiliza como una sentencia ESQL completa o en lugar de una expresión que forme parte de una sentencia ESQL:
  • Si es una sentencia ESQL completa, la serie de caracteres derivada de la evaluación de la primera fase se ejecuta como si fuera una sentencia ESQL.
  • Si es 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 enteros, y scalarVar1 y OperatorAsString son variables 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 entero, los valores enteros se pueden representar como series de caracteres y la transformación CAST necesaria se realiza antes de que EVAL continúe con su segunda fase de evaluación.

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

    El punto y coma incluido al final del literal de serie final es necesario, porque si se utiliza EVAL en lugar de una sentencia ESQL, su evaluación de primera fase debe devolver una serie que represente una sentencia ESQL válida, incluido el punto y coma de terminación.

Las variables declaradas en una sentencia EVAL no existen fuera de esa sentencia EVAL. De esta manera, EVAL es similar a una función, en la que las variables declaradas localmente son sólo locales y quedan fuera de ámbito al salir de la función.

La potencia real de EVAL es que permite construir de manera dinámica sentencias o expresiones de ESQL. En los ejemplos segundo y tercero indicados anteriormente, el valor de scalarVar1 u operatorAsString se puede establecer de acuerdo al valor de un campo de mensaje entrante u otro valor dinámico, que permite controlar efectivamente que se ejecuta ESQL sin que necesite una escalera IF THEN potencialmente extensa.

Sin embargo, examine las implicaciones que utilizar EVAL tiene en el rendimiento. La construcción y ejecución dinámica de las sentencias o expresiones consume necesariamente más tiempo que sólo ejecutar las preconstruidas. Si el rendimiento es muy importante, tal vez prefiera escribir un 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, se utiliza EVAL para sustituir una referencia de campo, no una expresión.

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

    En este ejemplo, el (SELECT T.x FROM Database.y) pasado a EVAL devuelve una lisa, que no se puede representar como una serie de caracteres.

El ejemplo siguiente es aceptable porque (SELECT T.x FROM Database.y AS T) es un literal de serie de caracteres, no una expresión en sí misma y, por consiguiente, es representable como una serie de caracteres.
SET OutputRoot.XML.Data.Result[]
 = EVAL('(SELECT T.x FROM Database.y AS T)');

Conceptos relacionados
ESQL

Tareas relacionadas
Desarrollo de ESQL

Referencia relacionada
Preferencia de sintaxis
Sentencias ESQL