MERGE
Synopsis
MERGE:pc mergeargument,... M:pc mergeargument,...
mergeargument には、以下を指定できます。
destination=source
引数
pc | オプション — 後置条件式 |
destination および source | マージされるローカル変数、プロセス・プライベート・グローバル、またはグローバル。クラス・プロパティとして指定された場合、source 変数は、多次元の (添え字付き) 変数である必要があります。 |
概要
MERGE destination=source は source を destination にコピーし、source のすべての下位を destination の下位にコピーします。これは、source を変更したり、destination のノードを削除することはありません。
MERGE コマンドを使用すると、ある変数のサブツリー (複数の添え字) を、別の変数に簡単にコピーできます。変数は、添え字付きのローカル変数、プロセス・プライベート・グローバル、またはグローバルのいずれかです。サブツリーとは、特定の変数の子孫であるすべての変数です。これまで、一連の SET コマンドと $ORDER 参照を組み合わせて行っていたサブツリーのコピーを、MERGE コマンド 1 つで実行できます。
MERGE は、source と destination が親子リレーションシップである場合に <COMMAND> エラーを発行します。
MERGE コマンドの実行には、他のほとんどの ObjectScript コマンドよりも時間がかかります。その結果、割り込みを受ける可能性も高くなります。割り込みの影響は、その実装ごとに異なります。Caché では、割り込みによって、コピー先のサブツリーに、ソースから予測できないサブセットがコピーされる可能性があります。
引数
pc
オプションの後置条件式。Caché は、後置条件式が True (0 以外の数値に評価される) の場合に MERGE コマンドを実行します。Caché は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。
destination および source
マージされる変数。変数は、ローカル変数、プロセス・プライベート・グローバル、またはグローバルのいずれかです。destination が未定義の場合、MERGE は定義を行い、source に設定します。source が未定義の場合、MERGE は正常に終了しますが、destination を変更しません。
ユーザは、複数のコンマ区切りの destination=source の組み合わせを指定することができます。これらは、左から右の順に評価されます。
mergeargument は、destination=source ペアを 間接演算で参照できます。例 : MERGE @tMergeString
mergeargument には、myargs... などのように可変個数のパラメータを指定する、参照によって渡される配列を指定できます。
例
以下の例では、グローバル変数 (^a) から別のグローバル変数 (^b) にサブツリーをコピーします。この場合は、マージの使用によって、より小さいグローバル ^b が作成され、これには ^a にある情報の ^a(1,1) サブツリーのみが含まれます。
SET ^a="cartoons"
SET ^a(1)="The Flintstones",^a(2)="The Simpsons"
SET ^a(1,1)="characters",^a(1,2)="place names"
SET ^a(1,1,1)="Flintstone family"
SET ^a(1,1,1,1)="Fred"
SET ^a(1,1,1,2)="Wilma"
SET ^a(1,1,2)="Rubble family"
SET ^a(1,1,2,1)="Barney"
SET ^a(1,1,2,2)="Betty"
MERGE ^b=^a(1,1)
WRITE ^b,!,^b(2),!,^b(2,1)," and ",^b(2,2)
以下の例では、コピー元のグローバル変数のサブツリーが結合された後の、コピー先のグローバル変数を示しています。
以下を実行するとします。
KILL ^X,^Y
SET ^X(2,2)="first"
SET ^X(2,2,4)="second"
SET ^Y(3,6,7)="third"
SET ^Y(3,6,8)="fourth"
SET ^Y(3,6,7,8,4)="fifth"
SET ^Y(3,6,7,8,9)="sixth"
WRITE ^X(2,2),!,^X(2,2,4),!
WRITE ^Y(3,6,7),!,^Y(3,6,8),!
WRITE ^Y(3,6,7,8,4),!,^Y(3,6,7,8,9)
以下の図は、実行後の ^X と ^Y の論理構造を示しています。
以下の MERGE コマンドを考えてみましょう。
MERGE ^X(2,3)=^Y(3,6,7,8)
前の文を実行すると、Caché は ^Y の一部を ^X(2,3) にコピーします。グローバル ^X は、以下の図のような構造になります。
メモ
ネイキッド・インジケータ
destination および source の両方がローカル変数である場合、ネイキッド・インジケータは変更されません。source がグローバル変数で、destination がローカル変数の場合は、ネイキッド・インジケータは source を参照します。
source および destination の両方がグローバル変数である場合、ネイキッド・インジケータの状態は、source が未定義 ($DATA(source)=0) であれば変更されません。これ以外の場合 ($DATA(source)=10 の場合)、ネイキッド・インジケータは、SET コマンドを MERGE コマンドと置き換え、source が値を持っているとして実行した場合と同じ値を取ります。ネイキッド・インジケータに関する詳細は、"Caché グローバルの使用法" の "ネイキッド・グローバル参照" を参照してください。
自己マージ
destination と source が同じ変数のとき、マージは行われず、ジャーナル・ファイルにも何も記録されません。しかし以前のセクションで説明された規定に基づいて、ネイキッド・インジケータは変更されます。
ウォッチポイント
MERGE コマンドはウォッチポイントをサポートしています。MERGE コマンドのウォッチポイントを設定する場合、Caché は、MERGE が監視されている変数の値を変更するたびに、ウォッチポイントをトリガします。ウォッチポイントを設定するには、ZBREAK コマンドを使用します。