EVAL 语句

EVAL 语句获取一个字符值,将它解释为 SQL 语句,然后处理它。

EVAL 函数(下面还会描述)获取一个字符值,但将它解释为返回一个值的 ESQL 表达式。

注: 用户定义的函数和过程不能在 EVAL 语句或 EVAL 函数中进行定义。

语法

EVAL 以表达式的形式获取一个参数,接着对该表达式求值,然后将得到的结果值数据类型转换为字符串(如果得到的结果还不是字符串)。因此,传递到 EVAL 的表达式必须能表示为字符串。

此第一阶段求值完成后,EVAL 的行为取决于它是用作为完整的 ESQL 语句还是用于替代形成 ESQL 语句的一部分的表达式:
  • 如果它是完整的 ESQL 语句,则从第一阶段求值派生出来的字符串将被当作 ESQL 语句执行。
  • 如果它是形成 ESQL 语句的一部分的表达式,则将字符串当作 ESQL 表达式来求值,EVAL 返回结果。

在下面的示例中,A 和 B 是整数标量变量,scalarVar1 和 OperatorAsString 是字符串标量变量。

下面的示例是 EVAL 的有效用法:
  • SET OutputRoot.XML.Data.Result = EVAL(A+B);

    表达式 A+B 是可接受的,因为尽管它返回整数值,但整数值可表示为字符串,因此在 EVAL 继续其求值的第二阶段之前将执行必需的数据类型转换。

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

    最后的字符串文字结束处的分号是必需的,因为如果使用 EVAL 替代 ESQL 语句,它的第一阶段求值必须返回代表包含终止分号的有效 ESQL 语句的字符串。

EVAL 语句中声明的变量不存在于该 EVAL 语句外。在这方面,EVAL 类似于函数,在它里面本地声明的变量仅是本地的,当函数退出时,作用域将不再有效。

EVAL 的真正强大之处在于它允许您动态构造 ESQL 语句或表达式。在上述第二、第三个示例中,scalarVar1 或 operatorAsString 的值可根据入局消息字段的值或其他动态值来设置,因此允许您无需可能会变得冗长的 IF THEN 框架即可有效地控制执行哪些 ESQL。

但请考虑使用 EVAL 的性能影响。语句或表达式的动态构造和执行与简单地执行预先构造好的语句或表达式相比,必然需要更多的时间。如果性能很重要,可取的是编写更特定但更快的 ESQL。

下面不是 EVAL 的有效用法:
  • SET EVAL(scalarVar1) = 2;

    在此示例中,EVAL 用于替换字段引用,而不是表达式。

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

    在此示例中,传递到 EVAL 的 (SELECT T.x FROM Database.y) 返回列表,它不能表示为字符串。

下面的示例是可接受的,因为 (SELECT T.x FROM Database.y AS T) 是字符串文字,它本身不是表达式,因此可以表示为字符串。
SET OutputRoot.XML.Data.Result[]
  = EVAL('(SELECT T.x FROM Database.y AS T)');
相关概念
ESQL 概述
相关任务
正在开发 ESQL
相关参考
语法图:可用类型
ESQL 语句
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak05020_