DECLARE ステートメント

DECLARE ステートメントは変数とそのデータ・タイプ、およびオプションで初期値を定義します。

構文

変数のタイプ

DECLARE ステートメントを使用して、以下の 3 種類の変数を定義できます。
外部
外部変数 (EXTERNAL キーワードで定義される) は、ユーザー定義プロパティー (UDP) とも呼ばれます (ユーザー定義プロパティーを参照)。これらはメッセージ・フローの存続期間にわたって存在し、フローを通過するすべてのメッセージにとって可視です。初期値 (オプションで DECLARE ステートメントによって設定される) の変更を、メッセージ・フロー・エディターによって設計時に加えたり、BAR エディターによってデプロイメント時に加えたりできます。ESQL によって値を変更することはできません。
通常
"通常" 変数の存続時間は、単に 1 つのメッセージがノードを通過するまでです。この種の変数は、このメッセージのみに可視です。"通常" 変数を定義するには、EXTERNAL および SHARED キーワードを両方とも省略します。
共用
共用変数 (SHARED キーワードで定義される) は長く存続します (存続期間の長い変数を参照)。これらはメッセージ・フローが変更または再始動されるときにだけ再初期化され、フローを通過するすべてのメッセージにとって可視です。ESQL によって値を変更できます。

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

ユーザー定義のプロパティー (UDP) を指示するには、EXTERNAL を使用します。UDP とは、メッセージ・フロー・エディターによって設計時に初期値を変更したり、ブローカー・アーカイブ・エディターによってデプロイメント時に初期値をオーバーライドしたりできるユーザー定義の定数のことです (初期値はオプションで DECLARE ステートメントによって設定されます)。ESQL によって値を変更することはできません。

UDP の概要については、ユーザー定義プロパティーを参照してください。

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 は、TYPECHARACTER で、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) を使用してデータに変更を加える必要がありません。代わりに、式の中のデータを直接参照できます。
共用変数と比較したデータベースの利点は以下のとおりです。
  • データが永続的です。
  • データがトランザクションとして変更されます。

ユーザーが、データベースの永続性とトランザクション性の利点を犠牲にしてでもパフォーマンスを向上させようと思っている場合、これらの読み取り書き込み変数は、存続時間が 1 つのメッセージより長く、パフォーマンスがデータベースより高いので、理想的です。

フロー共用変数 (つまり、スキーマ・レベルで定義された変数) を使用する際には、複数のフローが変数を更新する可能性がある場合に注意してください。特に、変数がカウンターとして使用されている場合にこの可能性があります。同様に、ノード共用変数 (つまり、モジュール・レベルで定義された変数) を使用する際には、複数のインスタンスが変数を更新する可能性がある場合に注意してください。

ユーザー・プログラムは、共用行変数を使用すると、入力ノードのメッセージのコピーの読み取り/書き込みを効率よく行えます。この変数は全般的に便利ですが、特に大規模なメッセージを処理する手法を単純化するのに便利です。

共用変数の使用例については、共用変数と外部変数の使用法を示した「メッセージ・ルーティング」サンプル・プログラムを参照してください。「メッセージ・ルーティング」サンプルは、Message Brokers Toolkitサンプル・ギャラリーにあります。

特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2005 Last updated: 11/07/2005
ak04980_