您可以配置 Compute、Filter 或 Database 节点以从数据库列中选择数据并在输出消息中包括它。下例假设您有一个数据库表 USERTABLE,它有两个 char(6) 数据类型的列(或与之相当的列),名为 Column1 和 Column2。该表包含两行:
Column1 | Column2 | |
---|---|---|
Row 1 | value1 | value2 |
Row 2 | value3 | value4 |
配置Compute、Filter 或 Database 节点以标识您已经在其中定义该表的数据库。例如,如果您使用缺省数据库(在节点的“数据源”属性上指定),右键单击节点,选择打开 ESQL,然后在本节点的模块中编写以下 ESQL 语句:
SET OutputRoot = InputRoot; DELETE FIELD OutputRoot.*[<]; SET OutputRoot.XML.Test.Result[] = (SELECT T.Column1, T.Column2 FROM Database.USERTABLE AS T);
这会产生以下输出消息:
<Test> <Result> <Column1>value1</Column1> <Column2>value2</Column2> </Result> <Result> <Column1>value3</Column1> <Column2>value4</Column2> </Result> </Test>
<Test> <Result> <Column1></Column1> <Column2></Column2> </Result> <Result> <Column1></Column1> <Column2></Column2> </Result> </Test>
XML 的确切结构并不重要,但包围它的标记必须是 <Test> 以与 ESQL 中的引用相匹配。如果不是,则 ESQL 语句会导致形成顶级包围标记,它不是有效的 XML。
如果您要创建一个输出消息,该消息包含满足特定条件的所有行的所有列,则使用带有 WHERE 子句的 SELECT 语句:
-- Declare and initialize a variable to hold the -- test vaue (in this case the surname Smith) DECLARE CurrentCustomer STRING 'Smith'; -- Loop through table records to extract matching information SET OutputRoot.XML.Invoice[] = (SELECT R FROM Database.USERTABLE AS R WHERE R.Customer.LastName = CurrentCustomer );
消息字段以与表中列出现相同的顺序创建。
如果您熟悉数据库环境中的 SQL,则可能需要对 SELECT * 进行编码。由于您必须启动所有到带有相关名称的列的引用,代理不接受这个。 这避免了所声明变量的含糊。 另外,如果您对 SELECT I.* 进行编码,则代理接受它,但是 * 被解释为首个子元素,而不是您所要求的来自其他数据库 SQL 的所有元素。
如果数据库系统区分大小写,您必须使用备用方法。如果要为生成的字段更改名称,也必须使用此方法:
SET OutputRoot = InputRoot; SET OutputRoot.XML.Test.Result[] = (SELECT T.Column1 AS Column1, T.Column2 AS Column2 FROM Database.USERTABLE AS T);
此示例产生和以上示例相同的消息。确保以正确的大小写指定到数据库列(在该示例中,是 T.Column1 和 T.Column2)的引用,从而与数据库定义完全匹配。 如果您没有这样做,例如,您指定 T.COLUMN1,则代理生成运行时错误。 注意 SELECT 语句中的 Column1 和 Column2 的使用。在此您可以使用任何值,它们不需要象本示例中的那样与您在数据库中定义的列名相匹配。