DECLARE 语句定义变量、变量的数据类型以及变量的(可选)初始值。
另请参阅 BEGIN ... END 语句的 ATOMIC 选项。当需要对共享变量进行大量更改时,BEGIN ATOMIC 构造十分有用;并且该构造对于防止其他实例查看数据的中间状态也非常重要。
使用 CONSTANT 可以定义常量。您可以在模式、模块、例程或复合语句中声明常量(隐式和显式)。这些情况下的行为如下:
在例程中声明的常量或变量将覆盖所有同名参数,以及外围模块或模式中声明的所有常量和变量。
使用 EXTERNAL 表示是用户定义的属性(UDP)。UDP 是用户定义的常量,其初始值(可以通过 DECLARE 语句设置)可以在设计时由消息流编辑器修改,也可以在部署时由代理归档编辑器覆盖。它的值不能由 ESQL 修改。
有关 UDP 的概述,请参阅 ESQL 中用户定义的属性。
在 DECLARE 语句中为 UDP 提供初始值时,该值就成了它的缺省值。但在设计时由消息流编辑器指定的任何值,或在部署时由 BAR 编辑器指定的任何值(甚至长度为零的字符串)都会覆盖在 DECLARE 语句上指定的任何初始值。
消息流中的所有 UDP 都必须有值,要么在 DECLARE 语句上指定,要么由消息流或 BAR 编辑器指定;否则就会发生部署时错误。在运行时,声明过 UDP 之后,它的值就可以被后面的 ESQL 语句查询,但不会被修改。
UDP 的优点是操作人员可以在部署时更改它们的值。例如,如果使用 UDP 保存配置数据,这意味着您可以在部署时为某个特定机器、任务或环境配置消息流,同时不必更改节点级代码。
只能在模块或模式中声明 UDP。
指定 UDP 的数据类型时请小心,因为会发生 CAST,将其强制转换为请求的 DataType。
DECLARE mycolour EXTERNAL CHARACTER ‘blue';
DECLARE TODAYSCOLOR EXTERNAL CHARACTER; SET COLOR = TODAYSCOLOR;其中 TODAYSCOLOR 是用户定义的属性,它具有类型为 CHARACTER,由消息流编辑器设置的 VALUE。
使用 NAME 可以定义别名(另一个名称),通过此别名,可以知道变量。
-- The following statement gives Schema1 an alias of 'Joe'. DECLARE Schema1 NAME 'Joe'; -- The following statement produces a field called 'Joe'. SET OutputRoot.XML.Data.Schema1 = 42; -- The following statement inserts a value into a table called Table1 -- in the schema called 'Joe'. INSERT INTO Database.Schema1.Table1 (Answer) VALUES 42;
DECLARE Schema1 EXTERNAL NAME; CREATE FIRSTCHILD OF OutputRoot.XML.TestCase.Schema1 Domain('XML') NAME 'Node1' VALUE '1'; -- If Schema1 has been given the value 'red', the result would be: <xml version="1.0"?> <TestCase> <red> <Node1>1</Node1> </red>
使用 NAMESPACE 可以定义别名(另一个名称),通过此别名,可以知道名称空间。
本示例演示了一个名称空间声明,它在路径中用作 SpaceId,在名称空间表达式中用作字符常量
DECLARE prefixOne NAMESPACE 'http://www.example.com/PO1'; -- On the right hand side of the assignment a namespace constant -- is being used as such while, on the left hand side, one is -- being used as an ordinary constant (that is, in an expression). SET OutputRoot.XML.{prefixOne}:{'PurchaseOrder'} = InputRoot.XML.prefixOne:PurchaseOrder;
使用 SHARED 可以定义共享变量。共享变量专用于流(如果在模式中声明)或节点(如果在模块中声明),但可以在流(线程)的实例之间共享。流级别变量的作用域最宽。例如,无法在执行组之间共享变量。
共享变量可用于实现消息流中的内存高速缓存,请参阅优化消息流响应时间。共享变量生命期较长,并且可被通过流的多个消息看到,请参阅长生存期变量。共享变量的生存期与声明此变量的执行组进程生存期、流或节点生存期,或者节点 SQL 的生存期相同(谁的生存期最短,谁就可以声明此变量)。。在每个代理启动后,共享变量会在第一条消息通过流或节点时进行初始化。
无法在函数或过程中定义共享变量。
这些读写变量的生存期长于一个消息但比数据库执行情况更好,对于准备牺牲数据库的持久性和事务优势以获得更佳性能的用户来说,它们是理想的选择。
对于流共享的变量(即,在模式级别定义的变量),当多个流可以更新这些变量,特别是变量作为计数器使用时,请格外小心。同样,对于节点共享的变量(即,在模块级别定义的变量),当多个实例可以更新这些变量时,请格外小心。
共享的行变量允许用户程序高效读/写输入节点消息的副本。这一点通常都很有用,特别是简化了处理大型消息的技术。
有一个局限性是子树不能直接从一个共享的行变量复制到另一个共享的行变量中。通过使用非共享行变量可以间接复制子树。从一个共享的行变量(使用 FIELDVALUE 函数)抽取的标量值可以复制到另一个共享的行变量中。
有关使用共享变量的示例,请参阅“消息路由”程序样本,它显示了如何同时使用共享变量和外部变量。“消息路由”样本位于Message Brokers Toolkit中的样本收藏夹中。