为节点创建 ESQL

创建 ESQL 来定制 ESQL 文件中 Compute、Database 或 Filter 节点的行为。

开始之前

要执行此任务,必须先完成下列任务:

在 ESQL 文件中,创建模块,将其与消息流中的节点相关联。一个模块只能与一个特定类型(Compute、Database 或 Filter)的节点相关联。在该模块内,不仅可以创建并使用函数和过程,也可以使用提供的语句和函数。另外还可以创建本地常量和变量。

如果创建了代理模式级别的常量、函数或过程,还可以在模块内引用它们。您可以定义某个级别的例程,在此级别上许多不同的模块可以使用它们,这能节省开发时间和维护工作您可以定义可供许多不同模块使用的某个级别的例程,这样可以节省开发时间并减少维护工作。

要为节点创建 ESQL:

  1. 切换到“代理应用程序开发”透视图
  2. 在”导航器“视图中,双击包含您要为其创建 ESQL 的节点的消息流。 在编辑器视图中打开消息流。
  3. 右键单击节点(必须是 Compute、Database 或 Filter 节点)并单击打开 ESQL 该消息流的缺省 ESQL 文件 <message_flow_name>.esql 将在编辑器视图中打开(如果文件不存在,将创建文件)。

    (如果已经创建了缺省文件并单击了打开 ESQL,此文件将在编辑器视图中打开,同时新模块被创建并且突出显示。)

    在 ESQL 文件结束处,为此节点创建一个框架模块。该模块的具体内容取决于节点的类型。

    下列模块是为 Compute 节点而创建的:

    CREATE COMPUTE MODULE <module_name>
              CREATE FUNCTION Main() RETURNS BOOLEAN
                        BEGIN
                                -- CALL CopyMessageHeaders();
                                          -- CALL CopyEntireMessage();
                  RETURN TRUE;
           END;
    
                  CREATE PROCEDURE CopyMessageHeaders() BEGIN
                                DECLARE I INTEGER 1;
                                DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
                                           WHILE I < J DO
                                                          SET OutputRoot.*[I] = InputRoot.*[I];
                         SET I = I + 1;
                  END WHILE;
           END;
    
                  CREATE PROCEDURE CopyEntireMessage() BEGIN
                  SET OutputRoot = InputRoot;
           END;
    END MODULE;
    要使上述 ESQL 能够部署到 V2.1 的代理,必须如下例中的粗体文本所示,将模块级变量 InputRootOutputRoot 传递到过程或函数:
    CREATE COMPUTE MODULE <module_name>
              CREATE FUNCTION Main() RETURNS BOOLEAN
                        BEGIN
                  -- CALL CopyMessageHeaders(InputRoot, OutputRoot);
                  -- CALL CopyEntireMessage(InputRoot, OutputRoot);
                  RETURN TRUE;
           END;
    
           CREATE PROCEDURE CopyMessageHeaders(IN InputRoot REFERENCE, IN
                  OutputRoot REFERENCE) BEGIN
                                DECLARE I INTEGER 1;
                                DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
                                           WHILE I < J DO
                   CREATE LASTCHILD OF OutputRoot DOMAIN FIELDNAME (
                  InputRoot.*[I] ); /*create the parser for OutputRoot*/
                                                          SET OutputRoot.*[I] = InputRoot.*[I];
                         SET I = I + 1;
                  END WHILE;
           END;
    
           CREATE PROCEDURE CopyEntireMessage(IN InputRoot REFERENCE, IN
                  OutputRoot REFERENCE) BEGIN
                  SET OutputRoot = InputRoot;
           END;
    END MODULE;

    模块名称取决于为相应的节点属性设置的值。缺省名称是 <message_flow_name>_<node_type>。 函数 Main 下面的 Compute 节点模块中声明了两个过程,Main 函数包含对这两个过程的调用,下面会对这两个过程进行描述。这些调用已被注释掉。如果希望包含这两个过程提供的功能,就必须对这些命令行取消注释,并在为 Main 函数创建的 ESQL 中将它们放到适当的位置。

    CopyMessageHeaders
    此过程在输入消息包含的各个头之间循环,并将每个头复制到输出消息。

    如果是从 V2.1 进行迁移,那么此过程等同于在“Compute 节点属性”对话框上选择“复制消息头”按钮时生成的代码。

    CopyEntireMessage
    此过程将包括头在内的全部输入消息内容复制到输出消息。

    如果是从 V2.1 进行迁移,那么此过程等同于在“Compute 节点属性”对话框上选择“复制整条消息”按钮时生成的代码。

    如果是为 Database 节点创建 ESQL 模块,则创建以下模块:

    CREATE DATABASE MODULE <module_name>
              CREATE FUNCTION Main() RETURNS BOOLEAN
                        BEGIN
                   RETURN TRUE;
           END;
    END MODULE;

    为 Filter 节点创建的模块除第一行(如下所示)之外,其他内容均与为 Database 节点创建的模块相同:

    CREATE FILTER MODULE <module_name>
  4. 将 ESQL 添加到此文件用来定制节点的行为。

    您应该在 Main 函数的 BEGIN 语句之后,RETURN TRUE 语句之前添加 ESQL 语句开始定制。 在 Main 函数以外的模块中,您可以添加 DECLARE 语句。要在文件中添加新的一行,请按 Enter 键。

    为帮助您编写有效的 ESQL,编辑器会在光标处显示有效语句和函数列表。要调用此项帮助,请单击编辑 > 内容帮助。在某些系统上,您还可以使用键组合 Ctrl+Space。 滚动显示的列表以查找并突出显示您需要的内容,然后按 Enter 键。相应的代码将插入到模块中,然后该列表消失。

    提供了以下方面的内容帮助:

    • 基于语法的可应用关键字
    • 必须同时出现的代码块,例如 BEGIN END;
    • 已定义的常量、标识、标签、函数以及可以使用的过程,即使当前项目没有引用例程,它们也可以在任何项目中。
    • 数据库相关名后面的数据库模式和表名,以及 INSERT、UPDATE、DELETE 和 SELECT 语句中的表列名,大多数情况下,还包括这些语句的 WHERE 子句。
    • 消息字段引用元素:运行时域(解析器)名称、类型表达式的格式、名称空间标识、名称空间限定的元素和属性名以及索引表达式的格式。
    • 输出消息根下的 Properties 文件夹中的内容。
    • 对于 DECLARE NAMESPACE 语句而言,是消息集和模式名称的目标名称空间。

    只有可以正确解析 ESQL,内容帮助才能正常运行。某些错误,如 BEGIN 后缺少 END 和其他块语句未终止错误会导致解析器出错,从而无法提供内容帮助。在无法正常执行的语句周围的其他区域尝试使用内容帮助,以便确定错误点的位置。或者也可以保存 ESQL 文件;保存此文件会导致验证和所有语法错误均写入“任务”视图。请参考报告的错误以理解和纠正 ESQL 语法。如果使用内容帮助生成大多数语句(例如块语句),这些语句会正确输入,并且出错的机会比较少。

  5. 使用该模块后,可以关闭 ESQL 文件。请在关闭此文件之前保存它,以便保留所有的更改并验证 ESQL。

如果您喜欢,也可以使用编辑器直接打开 ESQL 文件并在此文件中创建模块。要执行该操作:

  1. 切换到“代理应用程序开发”透视图
  2. 选择要在其中创建模块的 ESQL 文件。通过双击在编辑器视图中打开此文件,或者先右键单击,然后单击打开
  3. 在编辑器视图中,将光标定位在新的一行,并使用内容帮助为这种类型的节点选择合适的模块框架,例如 CREATE COMPUTE MODULE END MODULE;。如果您喜欢,也可以自己输入,但必须确保输入的内容和上述所需的框架一致。使用内容帮助可给您额外的帮助,因为它只插入有效的 ESQL,并在需要处插入匹配的 end 语句(例如 END MODULE;)。
  4. 用适当的方式完成模块编码工作。

无论使用何种方法打开 ESQL 文件,都要知道编辑器提供了功能来帮助您编写 ESQL。 这部分介绍了内容帮助,但是编辑器中还有更多可用的函数。 关于这些函数的信息,请参阅ESQL 编辑器

相关概念
消息流概述
代理模式
ESQL 模块
相关任务
开发消息流
修改节点的 ESQL
更改 ESQL 编辑器设置
相关参考
内置节点
ESQL 引用
ESQL 编辑器
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak09033_