DECLARE 语句

DECLARE 语句定义变量、变量的数据类型以及变量的(可选)初始值。

语法

  1. 函数或过程中不允许有 SHARED 关键字。
  2. 不可将 SHARED 的 DataType 指定为 REFERENCE。(要将消息树存储在共享变量中,请使用 ROW 数据类型。)
  3. EXTERNAL 变量是隐式常量。
  4. 向 EXTERNAL 变量赋初始值是一个很好的编程做法。
  5. 如果指定了 DataType REFERENCE,则必须在 InitialValueExpression 中指定变量或树的初始值。
  6. 使用 NAMESPACENAME 子句时,这些值是 CHARACTER 类型的隐式常量。

变量的类型

您可以使用DECLARE 语句来定义三种类型的变量:
外部
外部变量(使用 EXTERNAL 关键字定义)也称为用户定义的属性(UDP):请参阅ESQL 中用户定义的属性。它们在消息流的整个生存期存在,并对通过流的所有消息都可见。它们的初始值(可以通过 DECLARE 语句设置)可以在设计时由消息流编辑器修改,或在部署时由 BAR 编辑器修改。它们的值不能由 ESQL 修改。
常规
“常规”变量具有一个消息通过节点时的生存期。它们只对该消息可见。要定义“常规”变量,请省略 EXTERNAL 和 SHARED 关键字。
共享
共享变量可用于实现消息流中的内存高速缓存,请参阅优化消息流响应时间。共享变量生命期较长,并且可被通过流的多个消息看到,请参阅长生存期变量。共享变量的生存期与声明此变量的执行组进程生存期、流或节点生存期,或者节点 SQL 的生存期相同(谁的生存期最短,谁就可以声明此变量)。。在每个代理启动后,共享变量会在第一条消息通过流或节点时进行初始化。

另请参阅 BEGIN ... END 语句的 ATOMIC 选项。当需要对共享变量进行大量更改时,BEGIN ATOMIC 构造十分有用;并且该构造对于防止其他实例查看数据的中间状态也非常重要。

CONSTANT

使用 CONSTANT 可以定义常量。您可以在模式、模块、例程或复合语句中声明常量(隐式和显式)。这些情况下的行为如下:

在例程中声明的常量或变量将覆盖所有同名参数,以及外围模块或模式中声明的所有常量和变量。

DataType

您可以为DataType 指定的可能值为:
  • BOOL
  • BOOLEAN
  • INT
  • INTEGER
  • FLOAT
  • DEC
  • DECIMAL
  • DATE
  • TIME
  • TIMESTAMP
  • GMTTIME
  • GMTTIMESTAMP
  • INTERVAL:不适用于外部变量(指定了 EXTERNAL 选项)
  • CHAR
  • CHARACTER
  • BLOB
  • BIT
  • ROW:不适用于外部变量(指定了 EXTERNAL 选项)
  • REF:不适用于外部变量或共享变量(指定了 EXTERNAL 或 SHARED 选项)
  • REFERENCE-TO:不适用于外部变量或共享变量(指定了 EXTERNAL 或 SHARED 选项)
注: 如果指定 DataType 为 REFERENCE,还必须指定 InitialValueExpression

EXTERNAL

使用 EXTERNAL 表示是用户定义的属性(UDP)。UDP 是用户定义的常量,其初始值(可以通过 DECLARE 语句设置)可以在设计时由消息流编辑器修改,也可以在部署时由代理归档编辑器覆盖。它的值不能由 ESQL 修改。

有关 UDP 的概述,请参阅 ESQL 中用户定义的属性

在 DECLARE 语句中为 UDP 提供初始值时,该值就成了它的缺省值。但在设计时由消息流编辑器指定的任何值,或在部署时由 BAR 编辑器指定的任何值(甚至长度为零的字符串)都会覆盖在 DECLARE 语句上指定的任何初始值。

消息流中的所有 UDP 都必须有值,要么在 DECLARE 语句上指定,要么由消息流或 BAR 编辑器指定;否则就会发生部署时错误。在运行时,声明过 UDP 之后,它的值就可以被后面的 ESQL 语句查询,但不会被修改。

UDP 的优点是操作人员可以在部署时更改它们的值。例如,如果使用 UDP 保存配置数据,这意味着您可以在部署时为某个特定机器、任务或环境配置消息流,同时不必更改节点级代码。

只能在模块或模式中声明 UDP。

以下类型的代理节点可以访问 UDP:
  • Compute
  • Database
  • Filter
  • 从这些节点类型派生出的节点

指定 UDP 的数据类型时请小心,因为会发生 CAST,将其强制转换为请求的 DataType

示例 1

DECLARE mycolour EXTERNAL CHARACTER ‘blue';

示例 2

DECLARE TODAYSCOLOR EXTERNAL CHARACTER;
SET COLOR = TODAYSCOLOR;
其中 TODAYSCOLOR 是用户定义的属性,它具有类型CHARACTER,由消息流编辑器设置的 VALUE

NAME

使用 NAME 可以定义别名(另一个名称),通过此别名,可以知道变量。

示例 1

-- 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;

示例 2

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

使用 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

使用 SHARED 可以定义共享变量。共享变量专用于流(如果在模式中声明)或节点(如果在模块中声明),但可以在流(线程)的实例之间共享。流级别变量的作用域最宽。例如,无法在执行组之间共享变量。

共享变量可用于实现消息流中的内存高速缓存,请参阅优化消息流响应时间。共享变量生命期较长,并且可被通过流的多个消息看到,请参阅长生存期变量。共享变量的生存期与声明此变量的执行组进程生存期、流或节点生存期,或者节点 SQL 的生存期相同(谁的生存期最短,谁就可以声明此变量)。。在每个代理启动后,共享变量会在第一条消息通过流或节点时进行初始化。

无法在函数或过程中定义共享变量。

与数据库相比,共享变量的优点是:
  • 写访问更快。
  • 对小型数据结构的读访问更快。
  • 访问直接。即,无需使用特殊函数(SELECT)获取数据,也无需使用特殊语句(INSERT、UPDATE 或 DELETE)修改数据。而是可以在表达式中直接引用数据。
与共享变量相比,数据库的优点是:
  • 数据持久。
  • 数据通过事务更改。

这些读写变量的生存期长于一个消息但比数据库执行情况更好,对于准备牺牲数据库的持久性和事务优势以获得更佳性能的用户来说,它们是理想的选择。

对于流共享的变量(即,在模式级别定义的变量),当多个流可以更新这些变量,特别是变量作为计数器使用时,请格外小心。同样,对于节点共享的变量(即,在模块级别定义的变量),当多个实例可以更新这些变量时,请格外小心。

共享的行变量允许用户程序高效读/写输入节点消息的副本。这一点通常都很有用,特别是简化了处理大型消息的技术。

有一个局限性是子树不能直接从一个共享的行变量复制到另一个共享的行变量中。通过使用非共享行变量可以间接复制子树。从一个共享的行变量(使用 FIELDVALUE 函数)抽取的标量值可以复制到另一个共享的行变量中。

示例

有关使用共享变量的示例,请参阅“消息路由”程序样本,它显示了如何同时使用共享变量和外部变量。“消息路由”样本位于Message Brokers Toolkit中的样本收藏夹中。

相关概念
ESQL 概述
ESQL 中用户定义的属性
相关任务
正在开发 ESQL
创建动态字段引用
部署时使用 UDP 来配置消息流
相关参考
语法图:可用类型
ESQL 语句
消息流中的 ESQL 数据类型
消息流编辑器
FIELDVALUE 函数
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak04980_