MOVE ステートメントは、target によって示される参照変数の指すフィールドを変更します。
TO 文節を組み込む場合、ソースが指すのと同じエンティティーを指すように、ターゲット参照が変更されます。これは、メッセージ・フィールドか、宣言した変数のどちらかにできます。
PARENT、PREVIOUSSIBLING、NEXTSIBLING、FIRSTCHILD、または LASTCHILD 文節を組み込む場合、MOVE ステートメントは、ターゲット参照変数を、現在の位置との相対関係で指定した方向に移動しようとします。指定した方向にフィールドがあれば、移動は成功します。該当するフィールドがなければ、移動は失敗するので、参照変数は、引き続き以前と同じフィールドまたは変数を指し、LASTMOVE 関数が FALSE を戻します。移動が成功したか失敗したかは LASTMOVE 関数を使うことによって判定できます。
TYPE 文節、NAME 文節、またはその両方が存在する場合には、ターゲットが指定された方向 (PREVIOUSSIBLING、NEXTSIBLING、FIRSTCHILD、または LASTCHILD) にやはり移動しますが、この場合は、指定されたタイプ、名前、またはその両方を持つフィールドまで移動します。ターゲット・フィールドの名前またはタイプ (またはその両方) が分かっている場合に、これは特に役立ちます。なぜなら、こうすることによりフィールドにナビゲートするのに必要な MOVE ステートメントの数を減らすことができるからです。その理由は基準に一致しないフィールドがスキップされるところにあります。そのようなフィールドには、予期しないメッセージ・ツリー・フィールド (例えばホワイト・スペースを表すフィールド) が含まれます。
指定された移動が実行できない (つまり、指定されたタイプまたは名前を持つフィールドが存在しない) 場合には、ターゲットが未変更のままにされ、LASTMOVE 関数が FALSE を戻します。TYPE 文節、NAME 文節、またはその両方には、適切なデータ・タイプの値 (タイプには INTEGER、名前には CHARACTER) を戻す式を含めることができます。指定された値が NULL の場合には、例外がスローされます。
さらに 2 つの文節 NAMESPACE および IDENTITY は、NAME 文節の機能を向上させます。
NAMESPACE 文節は、タイプが文字のヌル以外の値を戻すすべての式を取ります。また、任意のネーム・スペースを表す * も取ります。* は ESQL の単項演算子ではないので、これを式と混同しないように注意してください。
NAMESPACE | NAME | エレメントの検索キー |
---|---|---|
いいえ | いいえ | タイプ、索引、または両方 |
いいえ | はい | デフォルトのネーム・スペース中の名前 |
* | はい | 名前 |
はい | いいえ | ネーム・スペース |
はい | はい | 名前とネーム・スペース |
IDENTITY 文節は TYPE、NAMESPACE および NAME 文節の代わりに単一のパス・エレメントを取り、フィールド参照に関する部分で説明されている規則すべてに従います (ESQL フィールド参照を参照してください)。
MOVE を PREVIOUSSIBLING または NEXTSIBLING を指定して使用するときには、REPEAT、TYPE、および NAME キーワードを指定することができます。そうすれば、現行フィールドと同じタイプおよび名前を持つ、直前または次のフィールドにターゲットが移動します。REPEAT キーワードは、同じ種類の兄弟に移動するときに特に便利です。なぜなら、タイプおよび名前を定義する式を書く必要がないからです。
MOVE cursor FIRSTCHILD TYPE 0x01000000 NAME 'Field1';
この例は、参照変数 cursor を、cursor が現在指しているフィールドの子フィールドのうち、タイプ 0x01000000 と名前 Field1 を持つ最初のものに移動させます。
MOVE ステートメントは、新規フィールドを絶対に作成しません。
WHILE LASTMOVE(sourceCursor) DO SET targetCursor.ItemNumber = sourceCursor.item; SET targetCursor.Description = sourceCursor.name; SET targetCursor.Price = sourceCursor.prc; SET targetCursor.Tax = sourceCursor.prc * 0.175; SET targetCursor.quantity = 1; CREATE NEXTSIBLING OF targetCursor AS targetCursor REPEAT; MOVE sourceCursor NEXTSIBLING REPEAT TYPE NAME; END WHILE;
参照変数、および参照変数の移動の例の詳細については、動的フィールド参照の作成を参照してください。